【发布时间】:2015-05-01 23:32:58
【问题描述】:
我想为声明为readonly 的NSArray 属性实现KVO。这个readonly 属性的getter 返回一个私有NSMutableArray 的副本,它支持公共readonly 一个:
在我的.h:
@interface MyClass : NSObject
@property (readonly, nonatomic) NSArray *myArray;
- (void)addObjectToMyArray:(NSObject *)obj;
- (void)removeObjectFromMyArray:(NSObject *)obj;
@end
在我的.m:
@interface MyClass()
@property (strong, nonatomic) NSMutableArray *myPrivateArray;
@end
@implementation MyClass
- (NSArray *)myArray {
return (NSArray *)[self.myPrivateArray copy];
}
- (void) addObjectToMyArray:(NSObject *)obj {
[self willChangeValueForKey:@"myArray"];
[self.myPrivateArray addObject:obj];
[self didChangeValueForKey:@"myArray"];
}
- (void) removeObjectToMyArray:(NSObject *)obj {
[self willChangeValueForKey:@"myArray"];
[self.myPrivateArray removeObject:obj];
[self didChangeValueForKey:@"myArray"];
}
@end
在我的测试中,当我调用 didChangeValueForKey: 时,我看到一个异常抛出。这是正确的做法吗?
【问题讨论】:
-
异常说明了什么?
-
为什么 myArray 是原子的而 myPrivateArray 是非原子的?如果 myPrivateArray 是非原子的并且您不同步任何内容,则 myArray 将不是线程安全的,因此它将是违反其原子契约的非原子属性。不过,这不是异常的原因..您是从不同的线程访问 MyClass 吗?您是否因此而收到 EXC_BAD_ACCESS 错误?
-
抱歉,两者都声明为
nonatomic。 -
是的......在运行时,在这种情况下无论如何这不会改变任何东西。它还告诉我你没有在这里发布真正的代码。你能用示例代码重现你的问题吗?不?如果示例代码没有问题,你怎么能指望别人在示例代码中找到问题呢?如果您不想发布真实代码,而只发布示例代码,那没关系,但您必须确保示例代码显示出与您尝试解决的问题相同的问题。
标签: ios objective-c key-value-observing