@property有哪些属性关键字?
readonly | 只读 |
assign | 单纯赋值(非对象类型使用) |
unsafe_unretained | 单纯赋值 (对象类型使用) |
retain | 进行对象保持操作 |
strong | 同retain 用于ARC |
weak | 不进行对象保持操作,同时访问安全的 用于ARC |
copy | 复制对象 (生成副本进行赋值,但只适用于遵循NSCopying协议的对象) |
nonatomic | 非原子操作,非线程安全 |
atomic | 原子操作,主要是在getter和setter方法里面加锁 |
如何让自己的类用copy修饰符?
1、需要声明该类遵循NSCopying协议
2、实现NSCopying协议里的方法,只有一个方法
- (instancetype)copyWithZone:(NSZone *)zone
{
XXModel *model = [[[self class] allocWithZone:zone] init];
model.name = self.name;
model.size = self.size;
model.objModelArray = [self.objModelArray mutableCopy];
// 有可能还需要进行深拷贝
return model;
}
如何重写带copy关键字的setter
- (void)setName:(NSString *)name
{
_name = [name copy];
}
@property的本质是什么?
getter+setter
作用:封装对象中的数据
编译器会自动帮你生成一套存取的方法
ivar、getter,setter是如何生成并添加到这个类中的?
编译器在编译期间自动合成,当你完成属性的定义后,编译器会自动编写访问这个属性所需要的方法。
这个过程除了生成getter、setter之外,编译器还要自动为类添加合适类型的实例变量(以_属性名开头,当然你可以用@synthesize name = _1name指定实例变量名)
什么情况下@property不会auto systhesis?
1、同时重写了getter和setter
2、重写了只读属性的getter
3、使用了dynamic(这个属性就是禁止自动合成)
4、在protocol中定义的所有属性,同category
@synthesize合成实例变量的规则是什么?
-
如果指定了成员变量的名称,会生成一个指定的名称的成员变量,
-
如果这个成员已经存在了就不再生成了.
-
如果是
@synthesize foo;
还会生成一个名称为foo的成员变量,也就是说:
如果没有指定成员变量的名称会自动生成一个属性同名的成员变量,
4. 如果是 @synthesize foo = _foo;
就不会生成成员变量了.
假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?
不会