在调用“获取规则”之间是否存在竞争条件?功能并保留结果?

时间:2016-02-19 07:49:23

标签: objective-c

如果某个功能遵循'获取规则' (如Apple所述:https://developer.apple.com/library/ios/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-SW1

在你有机会打电话给CFRetain之前,结果是否可以解除分配(因为CFRelease else-where)?

以下面的代码为例:

R.layout.content_main_wifi

在我们实际调用CFRetain时,我们是否可能持有对释放的CFString的引用?如果没有,为什么不呢?如果可能的话,我怎么能避免这种情况发生?

1 个答案:

答案 0 :(得分:0)

对于此代码:

CFStringRef * str = CFAttributedStringGetString(...);
CFRetain(str);

无法持有对CFString对象的悬空引用。

这是因为:

  1. 每个线程都有自己的堆栈,str位于该堆栈上,因此对该线程是私有的,因此没有其他线程可以引用该字符串对象。
  2. 自动释放池不能被清空,因为只在runloop的迭代之间发生,并且由于你还没有从该方法返回,你还没有完成runloop的迭代。