# 小技巧
- 重写
description
方法可以自定义打印对象
@implementation Student
- (NSString *)description {
NSString *des =
[NSString stringWithFormat:@"啦啦啦啦啦,我是一个人 %p", self];
return des;
}
@end
Student* stu = [Student new];
NSLog(@"%@", stu); // 啦啦啦啦啦,我是一个人 0x6000000d80d0
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# SEL消息机制
SEL
是Objective-C
中的一个类型,用于表示方法名,它实际上是一个C
语言中的指针
,指向一个C
函数的函数名
。@selector
用于获取一个方法的SEL
。performSelector:
用于执行一个SEL
对应的方法。- 将SEL对象作为一个消息发送给一个对象,就是命令该对象执行该对象的方法。
Student* stu = [Student new];
SEL s1 = @selector(sayHi);
[stu performSelector:s1];
// 带参数
SEL s2 = @selector(sayHi:);
[stu performSelector:s2 withObject:@"hello"];
1
2
3
4
5
6
7
2
3
4
5
6
7
# OC中的点语法
- 只是简写了
getter
和setter
- 获取和使用的时候去掉属性的下划线
Student* stu = [Student new];
stu.name = @"hello";
NSLog(@"%@", stu.name);
1
2
3
2
3
# 强制类型转换
Person* s = [Student new];
s.name = @"小花";
[(Student *)s study:@"数学"];
1
2
3
2
3
# @class
@class
用于声明一个类,它告诉编译器这个类已经定义了,但编译器不知道这个类的具体实现。- 作用:在循环引用的时候,在
.h
文件内用@class
声明,在.m
文件用#import
# @property
@property
相当于getter
和setter
的简写,可以省略getter
和setter
的声明和实现- 名字需要去掉下划线。
@property NSString* name
// 声明 @interface Person : NSObject @property NSString* name; @end Person* p = [Person new]; p.name = @"小明"; NSLog(@"%@", p.name);
1
2
3
4
5
6
7
8
# OC 中的 @property
参数
原子性(Atomicity)
atomic
(默认):线程安全,但性能较低。nonatomic
:非线程安全,性能更高,实际开发中多数使用。
@property (atomic) NSString *name;
@property (nonatomic) NSString *name;
1
2
2
二,内存管理(Memory Management)
参数 | 含义 | 使用场景 |
---|---|---|
strong (默认)/retain (MRC only) | 强引用,引用计数 +1 | 常用于对象类型 |
weak | 弱引用,不会增加引用计数,自动设为 nil | 常用于代理、避免循环引用 |
assign | 简单赋值,不管理内存(避免循环引用) | 常用于基本数据类型 |
copy | 复制一份对象,防止原对象被改动 | 常用于 NSString、Block |
@property (strong, nonatomic) NSString *title;
@property (weak, nonatomic) id<SomeDelegate> delegate;
@property (assign, nonatomic) NSInteger age;
@property (copy, nonatomic) NSString *name;
1
2
3
4
2
3
4
三、访问权限(Access Control)
readwrite
(默认):生成 getter 和 setter。readonly
:只生成 getter,不生成 setter。
@property (readonly, nonatomic) NSString *token;
@property (readwrite, nonatomic) NSString *username;
1
2
2
四、自定义方法名(可选)
getter=xxx
:自定义 getter 方法名。setter=xxx:
:自定义 setter 方法名。
@property (getter=isOpen, nonatomic) BOOL open;
1
使用方式:
if (self.isOpen) {
// do something
}
1
2
3
2
3
- 示例
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, copy, readonly) NSString *ID;
@property (nonatomic, weak) id delegate;
@property (getter=isOnline, nonatomic) BOOL online;
@end
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# ARC项目参入MRC组件
- 在
Build Phases
中添加Compile Sources
,选择MRC
组件的.m
文件,双击写入-fno-objc-arc