使用双间接指针分配将项目转换为ARC

时间:2012-03-06 11:15:52

标签: objective-c pointers automatic-ref-counting unsafe-unretained

我正在尝试将项目转换为ARC。该项目有一个Directed Acyclic Word Graph,它基本上意味着到处都有很多双重间接指针。

这对转换为ARC来说是一个相当大的挑战,尤其是我目前难以解决的一个问题。

这是场景。

假设你有NSString *

NSString *b = [[NSString alloc] initWithString:@"hello"];

您还有双重间接类型:

__unsafe_unretained NSString **a;

您想按如下方式将一个分配给另一个:

    a = &b;

这会产生转换错误:

error: assigning 'NSString *__strong *' to 'NSString *__unsafe_unretained *' changes retain/release properties of pointer

b更改为__unsafe_unretained不起作用。我也尝试了各种桥接演员。我错过了一些明显的东西吗?

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:5)

您可以使用指针指向const指针来避免内存管理问题:

__attribute__((objc_precise_lifetime)) NSString *b = [[NSString alloc] initWithString:@"hello"];
NSString *const*a;
a = &b;

你需要使用objc_precise_lifetime使b可用于整个上下文(ARC可能在最后一次引用后释放b

编辑:这也可以使用(但要注意管理双指针)

NSString *b = [[NSString alloc] initWithString:@"hello"];
NSString *__strong*a;
a = &b;