Objective c 调用';获取规则';功能和保留结果?

Objective c 调用';获取规则';功能和保留结果?,objective-c,Objective C,如果函数遵循“获取规则”(如Apple在此处所述:) 在您有机会调用CFRetain之前,是否可以取消分配结果(因为CFRelease在别处) 以以下代码为例: // Using CFAttributedStringGetString as an example // but I am asking about *any* GET rule function CFStringRef * str = CFAttributedStringGetString(...); CFRetain(str);

如果函数遵循“获取规则”(如Apple在此处所述:)

在您有机会调用CFRetain之前,是否可以取消分配结果(因为CFRelease在别处)

以以下代码为例:

// 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
    位于该堆栈上,因此线程是私有的,因此其他线程都没有对字符串对象的引用
  • 自动释放池不能被清空,因为这只发生在runloop的迭代之间,并且由于您还没有从该方法返回,您还没有完成runloop的迭代

  • 好的,
    str
    在堆栈上,是线程私有的,不能修改,但是它指向的内容可以在另一个线程中修改。我知道runloop是一个单线程,所以在这个函数返回之前,没有其他函数可以修改引用的对象,但是其他线程呢?