美文网首页
iOS 中协议中可以定义属性及定义属性的方式方法

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

作者: 傻傻小萝卜 | 来源:发表于2018-04-10 15:40 被阅读489次

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

    相关文章

      网友评论

          本文标题:iOS 中协议中可以定义属性及定义属性的方式方法

          本文链接:https://www.haomeiwen.com/subject/ercnhftx.html