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
网友评论