首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS6和ACAccount:推特类型消失了?

iOS6和ACAccount:推特类型消失了?
EN

Stack Overflow用户
提问于 2012-12-08 05:55:33
回答 1查看 110关注 0票数 0

我尝试用下面的代码在Twitter上验证我的应用程序:pastebin

但是,如果我删除(无用?)循环23ff行

代码语言:javascript
复制
for (ACAccount *acc in arrayOfAccounts) {
    [acc accountType].identifier;
    //Otherwise the identifier get lost - god knows why -__-
}

AccountHandler checkAccountOf:acc中进一步执行时,acc.type将变为(null)。如果我把循环留在里面,类型就设置正确了。我非常确定这与我在一个块中然后移到主队列中的事实有关,但我想知道我是不是做错了什么?这个循环看起来不像我应该做的事情。

类似的事情也发生在here上。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-08 08:07:33

ACAccount%s不是线程安全的。您应该只在它们发起的线程上使用它们。为此,你可以将“thread”读作“queue”。

虽然我还没有看到关于这方面的正式文档,但如果你NSLog一个账户,你会发现它是一个核心数据对象,核心数据对象上缺乏线程安全性的问题已经有了很好的记录。

具体的行为是核心数据对象可能是一个错误。这意味着您持有的是对对象的引用,而不是实际的对象。当您尝试访问某个属性时,该对象将被加载到内存中。

核心数据在下面做的是在内存中缓存数据并返回错误,直到它知道确实需要一个对象。缓存的高效协调限制了将对象协调到单个线程的Core数据对象的各个实例。

如果你做了应该把对象放到错误线程上的内存中的操作--这就是你在这里访问identifier时发生的事情--那么行为是未定义的。你可以只得到一个nil结果,或者你可能会使你的应用程序崩溃。

(旁白: Core Data这样工作的原因是它存储了一个对象图,因此可能有数千个相互连接的对象,您可以像遍历任何其他对象组一样遍历它。然而,您通常不想支付将它们中的每一个加载到内存中只是为了访问您要使用的任何通常很小的信息子集的相关成本,因此它需要一种在延迟加载的同时提供正常的Objective-C接口的方法)

您链接到的代码通过确保对象在队列跳跃之前在缓存中,从而在内存中绕过了这个问题。因此,“fetch from store”步骤发生在正确的队列上。然而,代码仍然是完全不安全的,因为根据核心数据所关心的应用逻辑,对象可能会从内存中转换回错误状态。

作者显然认为他们在Apple方面发现了一些bug。他们没有,他们只是决定假设某些东西是线程安全的,而不是线程安全的,然后找到了一种依赖于在测试中碰巧发生的未定义行为的方法。

这个故事的寓意是:让账户本身保持在一条主线上。如果您想对帐户的属性进行一些处理,则收集相关属性本身作为基础基础对象,并将其发送出去。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13771621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档