如何修改被readonly修饰的属性

结论:

1.用KVC改变只读属性的值

2.若禁止KVC方式修改只读属性的值,可在对应类重写类方法

// 该方法默认返回YES。 即在不存在满足条件的存取方法时,允许直接访问属性对应的实例变量
+ (BOOL)accessInstanceVariablesDirectly { return NO; }

 

分析:

1.被readonly修饰的属性,是没有创建setter方法的,所以通过点语法修改属性的值会报错;

2.在类的实现文件里,是可以通过实例变量修改属性的值;

3.在类的外部文件里,可以通过KVC修改对象的只读属性的值。  

 1 // .h
 2 @interface TestObject : NSObject
 3 @property (nonatomic, copy, readonly) NSString *testString;
 4 @property (nonatomic, assign, readonly) NSInteger testCount;
 5 
 6 - (void)show;
 7 @end
 8 
 9 // .m
10 @implementation TestObject
11 - (instancetype)init {
12     if(self = [super init]) {
13         _testString = @"test";
14         _testCount = 0;
15     }
16     return self;
17 }
18 
19 - (void)show {
20     NSLog(@"testString is %@, testCount is %ld", _testString, _testCount);
21 }
22 @end
1 // 外部文件
2 TestObject *obj = [TestObject new];
3 [obj show]; // testString is test, testCount is 0
4 
5 [obj setValue:@"TestObject" forKey:@"testString"];
6 [obj setValue:@2 forKey:@"testCount"];
7 [obj show]; // testString is TestObject, testCount is 2

 

原文地址:https://www.cnblogs.com/mustard22/p/11097506.html