美文网首页
333,iOS 中protocol中可以定义@property及

333,iOS 中protocol中可以定义@property及

作者: 枫叶1234 | 来源:发表于2020-10-18 11:06 被阅读0次

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

    相关文章

      网友评论

          本文标题:333,iOS 中protocol中可以定义@property及

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