结论:atom
1.用KVC改变只读属性的值;spa
2.若禁止KVC方式修改只读属性的值,可在对应类重写类方法code
// 该方法默认返回YES。 即在不存在知足条件的存取方法时,容许直接访问属性对应的实例变量
+ (BOOL)accessInstanceVariablesDirectly { return NO; }
分析:对象
1.被readonly修饰的属性,是没有建立setter方法的,因此经过点语法修改属性的值会报错;blog
2.在类的实现文件里,是能够经过实例变量修改属性的值;it
3.在类的外部文件里,能够经过KVC修改对象的只读属性的值。 io
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