如果一个函数遵循“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的迭代。