访问ViewController的属性线程安全吗?

时间:2011-09-16 03:59:35

标签: objective-c multithreading xcode thread-safety

可以吗

[BNUtilitiesQuick searchController].searchList.text不在主线程中?例如?

我听说NSString *是threadSafe。但是,

我什么时候表演

NSString * searchTerm =[BNUtilitiesQuick searchController].searchList.text;

[BNUtilitiesQuick searchController].searchList.text更改为另一个字符串?

1 个答案:

答案 0 :(得分:1)

在多线程环境中,您主要关注的是引用的对象在您尝试读取它们时不会被释放。

假设您正在使用具有合成属性的自定义类,如declaring properties上的Objective-C doc中所述,默认情况下属性被声明为原子。合成代码将类似于以下内容:

[_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

这或多或少,让你使用返回的对象,而不用担心它被释放。因此,如果您没有将属性声明为nonatomic,那么就可以防止因内存管理不当而导致的崩溃。

如果这些不是自定义类,您可能需要检查类的文档以确定如何声明属性。

然而,数据完整性是一个不同的问题。即使您的代码行中指定的所有属性都被声明为原子,也不能保证所有线程始终都能看到相同的值。所以,是的,text的值可能会在线程以您描述的方式获得其值时发生变化。最简单的解决方案是从同一个线程读取/写入可变数据。

而且,是的,NSString通常是线程安全的,因为它是不可变的。

您可以查看Apple的thread programming guide以获取更多信息。