iOS6和ACAccount:推特类型消失了



我试图用以下代码用Twitter验证我的应用程序:pastebin

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

for (ACAccount *acc in arrayOfAccounts) {
[acc accountType].identifier;
//Otherwise the identifier get lost - god knows why -__-
}

acc.type在中进一步执行时变为(null)CCD_ 1。如果保留循环,则类型设置正确。我很确定这与我在一个街区,然后进入主队列有关,但我想知道我是否做错了什么?这个循环看起来不像是我应该做的事情。

这里也发生了类似的事情。

ACAccounts不是线程安全的。您应该只在它们产生的线程上使用它们。为此,您可以将"thread"读取为"queue"。

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

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

Core Data在下面所做的是将东西缓存在内存中并返回错误,直到它知道真正需要一个对象为止。该缓存的有效协调限制了将对象协调到单个线程的核心数据对象的各个实例。

如果您在错误的线程上执行了应该将对象带入内存的操作——这就是在此处访问identifier时发生的情况——那么行为是未定义的。您可能只得到一个nil结果,或者您的应用程序可能会崩溃。

(顺便说一句:核心数据之所以能这样工作,是因为它存储了一个对象图,因此可能有1000个相互连接的对象,你可以像其他任何一组对象一样遍历它。然而,你通常不想为了访问你要使用的信息的子集而把它们中的每一个都加载到内存中,因此它需要一种方法在延迟加载时提供正常的Objective-C接口)

您链接到的代码通过确保对象在队列跳跃之前在缓存中,从而在内存中,绕过了这个问题。因此,"从存储中提取"步骤发生在正确的队列上。然而,代码是完全不安全的,因为对象可能根据Core Data关心应用的任何逻辑从内存中转换回故障。

作者显然认为他们发现了苹果的一些漏洞。他们还没有,他们只是决定假设某个东西是线程安全的,而事实并非如此,然后找到了一种依赖于测试中发生的未定义行为的方法。

这个故事的寓意是:把账目放在一条线上。如果你想对账户的属性进行一些处理,那么收集相关的属性本身作为基本的基础对象并将其发布。

最新更新