Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 避免从并发使用的访问器获取释放的对象_Objective C_Ios_Concurrency_Properties_Atomic - Fatal编程技术网

Objective c 避免从并发使用的访问器获取释放的对象

Objective c 避免从并发使用的访问器获取释放的对象,objective-c,ios,concurrency,properties,atomic,Objective C,Ios,Concurrency,Properties,Atomic,在我的多线程应用程序中,有一个属性可以由多个线程并发访问。属性定义为@property(retain)NSObject*status 如何以原子方式获取和保留该属性,以便在本地范围内安全地使用它?存储和检索此类值的最佳实践是什么 NSObject *status = [self status]; [... do some processing on status ...] // But: I cannot rely on the object assigned to my status var

在我的多线程应用程序中,有一个属性可以由多个线程并发访问。属性定义为
@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.
在我的多线程应用程序中,有一个属性可以由多个线程并发访问。该属性定义为@property(retain)NSObject*status

原子是默认值-不需要关键字或说明符

如何以原子方式获取和保留该属性,以便在本地范围内安全地使用它

由于它是
原子的
保留的
ed、
读写的
@合成的
,因此您可以始终使用访问器。如果您在初始值设定项中直接访问ivar,并且仅使用
dealloc
,并且在其他任何地方使用访问器,那么在您所询问的方面它将是安全的。返回值为
retain
+
autoreleased
。因为它是自动释放的,所以对象将继续存在——至少在本地线程上的顶部自动释放池弹出之前是这样

上次我穿过时,它看起来像这样(以简单的形式):

虽然我不记得
自动释放
是否在锁中(最好是在外面,以缩短锁时间)

存储和检索此类值的最佳实践是什么

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.
原子属性对并发性或线程安全性很小——不要认为它们是正确线程安全的替代品。原子属性访问器提供的内容涵盖线程安全也是不常见的。通常,对于一个正确的并发程序,您需要的不仅仅是一个原子。我很少使用原子属性,并且制作一些疯狂的并发程序。如果需要高性能/事务并发性,则需要知道如何有效地使用锁。当然,也有很多方法可以避免并发设计。我的自动解决方案包括处理锁定自己

在我的多线程应用程序中,有一个属性可以由多个线程并发访问。该属性定义为@property(retain)NSObject*status

原子是默认值-不需要关键字或说明符

如何以原子方式获取和保留该属性,以便在本地范围内安全地使用它

由于它是
原子的
保留的
ed、
读写的
@合成的
,因此您可以始终使用访问器。如果您在初始值设定项中直接访问ivar,并且仅使用
dealloc
,并且在其他任何地方使用访问器,那么在您所询问的方面它将是安全的。返回值为
retain
+
autoreleased
。因为它是自动释放的,所以对象将继续存在——至少在本地线程上的顶部自动释放池弹出之前是这样

上次我穿过时,它看起来像这样(以简单的形式):

虽然我不记得
自动释放
是否在锁中(最好是在外面,以缩短锁时间)

存储和检索此类值的最佳实践是什么

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
之前,仍然有一小段时间可以释放对象。我不确定这一点。但如果您愿意,您可以创建自己的访问器方法,该方法将返回保留的对象<代码>返回[\u status retain]
如果您控制此“NSObject”的代码,那么这是您自己的问题-为什么一些代码可以在其他代码发布它的同时修改其内部?糟糕的封装为什么你认为
NSObject*status=[[self status]retain]将不会修复此问题???如果任何其他线程释放您的状态,通过更改属性,您仍将存储对它的引用并保留它。只是别忘了平衡调用
release
@RomanTemchenko,因为在调用
[self status]
之后,但在
retain
之前,仍然有一小段时间可以释放对象。我不确定这一点。但如果您愿意,您可以创建自己的访问器方法,该方法将返回保留的对象<代码>返回[\u status retain]
如果您控制此“NSObject”的代码,那么这是您自己的问题-为什么一些代码可以在其他代码发布它的同时修改其内部?封装不良