链接
objc非主流代码技巧
[objc]readonly属性支持扩展的写法
假如一个类有一个readonly属性:
@interface Sark : NSObject
@property (nonatomic, readonly) NSArray *friends;
@end
.m中可以使用_friends来使用自动合成的这个变量,但假如:
- 习惯使用self.来set实例变量时(只合成了getter)
- 希望重写getter进行懒加载时(重写getter时则不会生成下划线的变量,除非手动@synthesize)
- 允许子类重载这个属性来修改它时(编译报错属性修饰符不匹配)
这种readonly声明方法就行不通了,所以下面的写法更有通用性:
@interface Sark : NSObject
@property (nonatomic, readonly, copy/加上setter属性修饰符/) NSArray *friends;
@end
如想在.m中像正常属性一样使用:
@interface Sark ()
@property (nonatomic, copy) NSArray *friends;
@end
子类化时同理。iOS SDK中很多地方都用到了这个特性。