OC 中类和协议中property的区别

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 
@property (nonatomic, copy) NSString *name;
@end
@interface ViewController ()
@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的区别)