readonly:只读属性,只生成getter方法,也就是说只能访问变量,不能修改。
那我们如果想要改变类中声明为readonly的属性值该怎么做呢?
如果直接用属性的setter方法,那么就直接报错,提示不能给声明为readonly的属性赋值。
这个时候我们可以用KVC来给声明为readonly的属性重新赋值。
例:
Dog.h
@interface Dog: NSObject
@property (nonatomic, assign, readonly) NSInteger num;
@property (nonatomic, copy, readonly) NSString *name;
- (instancetype)initNum:(NSInteger)num name:(NSString *)name ;
@end
*******
Dog.m
@implementation Dog
- (instancetype)initNum:(NSInteger)num name:(NSString *)name {
self = [super init];
if (self) {
_num=num;
_name=[name copy];
}
return self;
}
************************
Dog *dogOne=[[Dog alloc]initNum:1 name:Tom];
如何修改dogOne对象的name属性值为Jerry。
dogOne=@“Jerry”//会直接报错,不能给声明为readonly的属性赋值
用KVC
[dogOne setValue:@"Jerry" forKey:NSStringFromSelector(@selector(name))];
NSlog(@" dogOne name=%@",dogOne.name);
运行结果
dogOne name=Jerry
修改成功!!!