在c ++类中保留ARC对象

时间:2011-12-20 00:38:57

标签: objective-c automatic-ref-counting

我有一些代码必须保留为c ++,但我需要在这些c ++类中存储objective-c对象。当它们存储在这里时,它们不会被其他任何地方引用,所以我不能将它们从我的下面删除。在ARC之前,我只是在将它们放入c ++类之前保留它们,并在它们被删除时自动释放它们。一切都有罚款。

但是对于ARC,我不知道该怎么做。是否使c ++变量__unsafe_un得足够?似乎不是因为一旦obj-c代码不再使用那些对象它将被删除,或者我不理解__unsafe_unretained做了什么。我可以在ARC下调用CFRetain()和CFAutorelase()吗?

在ARC下处理此问题的正确方法是什么? NSArray做了什么深入了解它所存储的对象?

2 个答案:

答案 0 :(得分:4)

您可以在ARC下调用CFRetain和CFRelease。您有责任平衡每个CFRetain和CFRelease,因为ARC不会关注这些功能。

没有CFAutorelease功能。您可以使用objc_msgSend(myObject, sel_registerName("autorelease"))执行自动释放。你在这里跳过的箍应该是一个红旗,你正在做一些可能是错误的事情。

通常情况下,在ARC下更好的方法是找到一种不在其他类型的内存blob中存储对象引用的方法。如果将它们编译为Objective-C ++,请注意member variables of C++ objects can be qualified __strong or __weak

更新

Mac OS X 10.9和iOS 7.0的公共SDK包含CFAutorelease功能,即使在ARC下也可以使用。

答案 1 :(得分:4)

在将一些旧代码转换为Xcode 4.3时,我使用桥接构建取得了一些成功。它不会让我直接桥接,但我能够通过空洞*桥接。我这样做只是为了让一些旧的代码工作,所以我不能保证它完美无缺。

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;