在C++类中保留ARC对象

13

我有一些必须保留为C++代码的内容,但我需要在这些C++类中存储Objective-C对象。这些对象在存储在此期间不会被引用到其他任何地方,因此不能在删除它们之前先释放。在ARC之前,我只是在将它们放入C++类之前对其进行了保留,并在移除时进行了自动释放。一切都很好。

但是使用ARC后,我不确定该怎么办。将C++变量设置为__unsafe_unretained是否足够?似乎并不是,因为一旦Obj-C代码不再使用对象,它就会被删除,或者我没有理解__unsafe_unretained的含义。我能否在ARC下调用CFRetain()和CFAutorelease()?

在ARC下处理这个问题的正确方法是什么?NSArray在最底层上做了什么来保持它所存储的对象?


2
__unsafe_unretained 的作用就是不保留对象。但无论如何,我不明白为什么不能使用普通的 __strong 变量来持有你的 Obj-C 对象。 - Lily Ballard
是的,在普通的C++变量的情况下可能是正确的,但如果需要将Obj-C对象存储在malloc'd内存块中呢?苹果文档暗示这很有用,但并没有真正提供如何做到这一点的答案(或者假设答案是显而易见的,但至少对我来说不是)。 - Roger Gilbrat
1
好的,"显而易见"的答案是 "为该文件关闭 ARC" ;) - Lily Ballard
2个回答

5
在ARC下,您可以调用CFRetain和CFRelease。您需要平衡每个CFRetain与一个CFRelease,因为ARC不关注这些函数。
没有CFAutorelease函数。您可以使用objc_msgSend(myObject,sel_registerName(“autorelease”))来执行自动释放。您此处跳过的步骤应该是一个红旗,表示您正在做某些可能错误的事情。
通常,在ARC下最好找到一种方法,不要将对象引用存储在其他未定义类型的内存块中。请注意,如果将它们编译为Objective-C ++,则C ++对象的成员变量可以被标记为__strong或__weak。
更新
Mac OS X 10.9和iOS 7.0的公共SDK包括一个CFAutorelease函数,即使在ARC下也可以使用。

4

在将一些旧代码转换为Xcode 4.3时,我尝试使用桥接转换并取得了一些成功。它不允许我直接进行桥接,但是我能够通过void *进行桥接。我只是这样做是为了让一些旧代码工作,所以不能保证它完美运行。

struct {
  __unsafe_unretained UIView *view;
} blah;
...
blah = malloc(sizeof(blah));
...
// Cast the pointer with +1 to retain count
blah->view = (__bridge UIView *) (__bridge_retained void *) myView;
...
// blah->view can be used as normal
...
// Transfer ownership back to ARC for releasing
myView = (__bridge_transfer UIView *)(__bridge void *)blah->view;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接