class 和 protocol 都可以聲明 property
class 聲明一個(gè) property 主要做了五件事:
@property (nonatomic, copy) NSString *name;
1、生成一個(gè)下劃線開頭,同名的成員變量:_name
2、定義getter 方法:-(NSString *)name
3、定義setter 方法:-(void)setName:
4、實(shí)現(xiàn)getter 方法
5、實(shí)現(xiàn) setter 方法
4.5 這倆在 2012 年左右,需要通過@synthesize來合成實(shí)現(xiàn),現(xiàn)在已經(jīng)不用顯式使用了
如果是個(gè)只讀的屬性,那就是三件事,沒有 3 和 5
在協(xié)議中聲明一個(gè)屬性,只做了上面的 123三件事,沒有去實(shí)現(xiàn) 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);
}
所以遵守協(xié)議的類,雖然編譯期可以訪問 name,但運(yùn)行時(shí)卻會(huì)崩潰,因?yàn)檫\(yùn)行時(shí)找不到-(NSString*)name 這個(gè) getter 方法的實(shí)現(xiàn)
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'
要想正常使用,需要在遵守協(xié)議的類里實(shí)現(xiàn)
@synthesize name;
或者
@synthesize name = _xxx;
這樣delegate對(duì)象,就可以正常訪問 name 了,這里的name 沒有初始化,是沒有值的

image.png
分類Category里聲明一個(gè)屬性做的事情更少,只有 23兩件事,具體請(qǐng)看另一篇
http://www.itdecent.cn/p/c723ba728a0b