美文网首页
OC 中类和协议中property的区别

OC 中类和协议中property的区别

作者: chaeyeonyanse | 来源:发表于2020-01-17 17:48 被阅读0次

    class 和 protocol 都可以声明 property
    class 声明一个 property 主要做了五件事:

    @property (nonatomic, copy) NSString *name;
    

    1、生成一个下划线开头,同名的成员变量:_name
    2、定义getter 方法:-(NSString *)name
    3、定义setter 方法:-(void)setName:
    4、实现getter 方法
    5、实现 setter 方法
    4.5 这俩在 2012 年左右,需要通过@synthesize来合成实现,现在已经不用显式使用了

    如果是个只读的属性,那就是三件事,没有 3 和 5

    在协议中声明一个属性,只做了上面的 123三件事,没有去实现 setter 和 getter 方法,

    @protocol SomeProtocol <NSObject>
    @property (nonatomic, copy) NSString *name;
    @end
    
    @interface ViewController ()<SomeProtocol>
    @end
    @implementation ViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
        NSLog(@"name = %@",self.name);
    }
    

    所以遵守协议的类,虽然编译期可以访问 name,但运行时却会崩溃,因为运行时找不到-(NSString*)name 这个 getter 方法的实现

    2020-01-17 17:39:45.852192+0800 Protocol[23575:667573] -[ViewController name]: unrecognized selector sent to instance 0x7feadc609760
    2020-01-17 17:39:45.855738+0800 Protocol[23575:667573] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController name]: unrecognized selector sent to instance 0x7feadc609760'
    

    要想正常使用,需要在遵守协议的类里实现

    @synthesize name;
    

    或者

    @synthesize name = _xxx;
    

    这样delegate对象,就可以正常访问 name 了,这里的name 没有初始化,是没有值的


    image.png

    分类Category里声明一个属性做的事情更少,只有 23两件事,具体请看另一篇
    https://www.jianshu.com/p/c723ba728a0b

    相关文章

      网友评论

          本文标题:OC 中类和协议中property的区别

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