从次线程访问实例属性(iPhone-SDK)

Posted

技术标签:

【中文标题】从次线程访问实例属性(iPhone-SDK)【英文标题】:Accessing Instance Attributes from Secondary Thread (iPhone-SDK) 【发布时间】:2010-03-08 06:46:18 【问题描述】:

我有一个具有 NSDictionary 属性的类。在这个类中,我调度另一个线程来处理 NSXMLParser 处理。在我的 -didStartElement 中,我访问类中的字典(将 XML 中的元素与字典中的元素进行比较)。

此时我得到未定义的结果。使用 NSLog(我在 XCode 调试方面并不先进),我发现它在访问 NSDictionary 时会爆炸。我尝试只是迭代字典并将键/值转储到 didStartElement 中,并且每次都会在不同的键处炸弹。

我唯一能得出的结论是,在从辅助线程访问主线程属性方面,我正在做的事情并不符合犹太教规。我对多线程有些陌生,不确定什么是从其他线程安全访问属性的最佳协议。

谢谢大家。

【问题讨论】:

【参考方案1】:

如果您可以访问另一个线程中的一个线程使用的内存,我会感到惊讶,除非该字典是静态/全局的。我会采取两种方法之一,不知道 iPhone SDK 的复杂性 -

    在单独的线程中处理所有字典访问(填充、实例化、查找等) 使用某种相当于线程安全字典的 iPhone:link

【讨论】:

【参考方案2】:

在 Objective-C 中启用线程安全访问实例变量的方法很少。最简单的方法是将@property 声明定义为原子的。在这种情况下,自动生成的 setter 和 getter 将在 self 上同步。

另一种方法是将关键代码包装在 @synchronized 块中。

最好的方法是创建一个 NSOperation 子类来处理获取和解析,并通过委托或块提供回调(如果您 >= ios4.0),以通知您的消费者操作已完成。

并发 NSOperations 需要一些样板代码才能使它们正常工作,请参阅此(示例适用于 Snow Leopard,但概念相同):http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/

【讨论】:

以上是关于从次线程访问实例属性(iPhone-SDK)的主要内容,如果未能解决你的问题,请参考以下文章

Spring的scope="prototype"属性

获取 NSManagedObject 实例的上下文是不是是线程安全的?

Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPh

Object C 属性、特性、类型

java基础---多线程---细碎总结

ThreadLocal源码分析