iOS中协议中和分类中是可以用@property形式声明属性的,只不过在协议、分类中声明的属性,只有对应的setter/getter方法,并没有生成对应的成员变量。因为协议中只可以声明方法,分类中只能声明方法和对应的实现。
Protocol
@protocol MyProtocol
@property (nonatomic, strong)NSString *protocolName;
@end
@interface ViewController :UIViewController
@end
如果一个类遵守这个协议的话,在该类中即可调用出self.protocolName,但是如果直接调用self.protocolName = @"就是个这个鬼";
self.protocolName = @"这是个什么鬼啊";
NSLog(@"%@",self.protocolName);
项目会直接出现崩溃
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController setProtocolName:]: unrecognized selector sent to instance 0x7f9fb350aa20'
实现方法1:
这是由于在协议当中的属性只有只有对应的setter/getter,但是没有成员变量,如果直接直接将其get方法写出如下:
- (NSString*)protocolName {
return @"这个是个什么鬼";
}
这样调用的话,就能够直接调用
NSLog(@"%@",self.protocolName);
输出结果为:
2018-04-10 15:30:36.373180+0800 链式编程[36622:228189] 这个是个什么鬼
实现方法2:
@interface ViewController ()
@end
@implementation ViewController
@synthesize protocolName =_protocolName;
上面方法中主要用到了@synthesize上面声明部分的 @synthesize protocolName =_protocolName; 意思是说,protocolName 属性为 _protocolName 成员变量合成访问器方法。 也就是说,protocolName属性生成存取方法是setprotocolName,这个setprotocolName方法就是_protocolName变量的存取方法,它操作的就是_protocolName这个变量。通过这个看似是赋值的这样一个操作,我们可以在@synthesize 中定义与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问
self.protocolName = @"这是个什么鬼啊";
NSLog(@"%@",self.protocolName);
输出结果:
2018-04-10 15:30:36.373180+0800 链式编程[36622:228189] 这个是个什么鬼
网友评论