协议中可以声明属性:
@protocolPrintable
@property(copy,nonatomic)NSString*desc;
@end
遵从该协议的类,会生成属性。不同于类定义中声明的属性,协议属性并不会自动合成getter / setter方法。
对于遵从这种协议的类,可以用两种方法来合成属性。
1、在类的定义中,声明相同的属性,因为此属性会自动合成,所以类自动满足协议要求。AppDelegate 中的 window 属性,就是通过这种方法生成的。
@interfaceAppDelegate :UIResponder
@property(strong,nonatomic)UIWindow*window;
@end
此种方法实现协议属性,只能在类的定义中声明属性,不可以在扩展中,下面的做法是错误的:
@interface MyClass () // Class extension
@property(copy,nonatomic)NSString*desc;
@end
2、在类的实现中使用 synthesize 进行合成
@implementation MyClass () // Class implementation
@synthesizedesc;
@end
扩展
以下几种属性声明,编译器不会自动合成,生成成员变量:
1、category 中声明的属性不会自动合成;
2、protocol 中声明的属性(本文)不会自动合成;
3、 @dynamic 修饰的属性不会自动合成;
4、 readonly 属性,类中实现getter方法,不会自动合成;
5、 readwrite 属性,类中实现getter / setter方法,不会自动合成,
6、父类中的属性,子类重新声明,子类的属性不会自动合成。
网友评论