【发布时间】:2012-01-31 13:51:26
【问题描述】:
在我的多线程应用程序中,有一个属性可以被多个线程同时访问。该属性定义为@property (retain) NSObject *status。
如何以原子方式获取和保留该属性,以便可以在本地范围内安全地使用它?存储和检索此类值的最佳做法是什么?
NSObject *status = [self status];
[... do some processing on status ...]
// But: I cannot rely on the object assigned to my status variable
// still being valid, since another thread might have used my
// [self setStatus] accessor, implicitly calling a release on the old object,
// releasing it under my feet.
// Not even NSObject *status = [[self status] retain]; would fix that.
【问题讨论】:
-
为什么你认为
NSObject *status = [[self status] retain];不会解决这个问题???如果任何其他线程释放您的状态,通过更改属性,您仍将存储对它的引用并保留它。只是不要忘记平衡呼叫release。 -
@RomanTemchenko 因为在调用
[self status]之后但在retain之前仍有一小段时间可以释放对象。 -
我不确定这一点。但是,如果您愿意,您可以创建自己的访问器方法,该方法将返回保留的对象。
return [_status retain] -
如果你控制这个“NSObject”的代码,那么这是你自己的问题——为什么有些代码可以修改它的内部,而其他代码正在释放它?封装不好
标签: objective-c ios concurrency properties atomic