objc非主流代码技巧

链接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中很多地方都用到了这个特性。

你可能感兴趣的:(objc非主流代码技巧)