如果一个函数遵循“get规则”(如apple在此处所述:https://developer.apple.com/library/ios/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-SW1
在您有机会调用cfretain之前,是否可以释放结果(因为cfrelease else where)?
以下面的代码为例:

// Using CFAttributedStringGetString as an example
// but I am asking about *any* GET rule function

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

在实际调用cfretain时,我们是否可以保留对已释放cfstring的引用?如果没有,为什么不呢?如果可能的话,我怎样才能避免这种情况发生呢?

最佳答案

对于此代码:

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

不可能持有对CFString对象的悬挂引用。
这是因为:
每个线程都有自己的堆栈,str在该堆栈上,因此是线程的私有线程,因此没有其他线程对string对象有引用。
无法清空自动释放池,因为这只发生在runloop的迭代之间,并且由于尚未从该方法返回,因此尚未完成runloop的迭代。

10-06 13:25