【问题标题】:is Accessing ViewController's property thread safe?访问 ViewController 的属性线程安全吗?
【发布时间】:2011-09-16 03:59:35
【问题描述】:

可以吗

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

我听说NSString * 是线程安全的。不过,

我表演的时候呢

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

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

【问题讨论】:

    标签: objective-c multithreading xcode thread-safety


    【解决方案1】:

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

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

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

    这或多或少地让你使用返回的对象而不用担心它被释放给你。所以,如果你没有将你的属性声明为nonatomic,你应该可以防止由于内存管理不当而导致的崩溃。

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

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

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

    您可能希望查看 Apple 的 thread programming guide 以了解更多信息。

    【讨论】:

    • Atomic 可能是默认值,但大多数 UIKit 类都声明它们的属性是非原子的。我不知道示例中的类是自定义的还是来自 UIKit。
    • @morningstar,更新答案以反映您的评论。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多