iOS 中协议中可以定义属性及定义属性的方式方法

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] 这个是个什么鬼

推荐阅读更多精彩内容