一般情况下,readonly属性的值是无法修改的,但可以通过特殊方式修改。
定义一个student的类,其中name属性为readonly类型的变量

@interface JFStudent : NSObject

@property(nonatomic,copy,readonly) NSString *hisName;

@property(nonatomic,copy) NSString *age;

-(instancetype)initWithName:(NSString *)name age:(NSString *)age;

@end
@implementation JFStudent

-(instancetype)initWithName:(NSString *)name age:(NSString *)age{
    if (self = [super init]) {
        _hisName = name;
        _age = age;
    }
    return self;
}

@end

然后定义一个JFStudent类型的变量

JFStudent *stu = [[JFStudent alloc]initWithName:@"tom" age:@"11"];
NSLog(@"修改前++++++++%@",stu.hisName);

修改hisName变量,会提示出错。

这时可以用kvc来设置

[stu setValue:@"胡说" forKey:NSStringFromSelector(@selector(hisName))];
NSLog(@"修改后----------------%@",stu.hisName);

打印结果为:

若age为NSInteger属性,

@property(nonatomic,assign,readonly) NSInteger age;

则可以用

[stu setValue:@(20) forKey:NSStringFromSelector(@selector(age))];

打印结果为

若想禁止kvc修改readonly属性的值,则可以在定义readonly属性的类中添加该方法

//默认返回为YES,表示可允许修改。改为NO即可
+(BOOL)accessInstanceVariablesDirectly{
    return NO;
}

 

posted on 2017-01-19 15:04  lixin327  阅读(2847)  评论(0编辑  收藏