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

Max*_*eod 3 pointers objective-c automatic-ref-counting unsafe-unretained

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

这对于转换为ARC来说是一个相当大的挑战,特别是一个问题让我目前难以接受.

这是场景.

假设你有一个NSString *:

NSString *b = [[NSString alloc] initWithString:@"hello"];
Run Code Online (Sandbox Code Playgroud)

您还有一个双间接类型:

__unsafe_unretained NSString **a;
Run Code Online (Sandbox Code Playgroud)

您想要将一个分配给另一个,如下所示:

    a = &b;
Run Code Online (Sandbox Code Playgroud)

这会产生转换错误:

error: assigning 'NSString *__strong *' to 'NSString *__unsafe_unretained *' changes retain/release properties of pointer
Run Code Online (Sandbox Code Playgroud)

更改b__unsafe_unretained不工作.我也尝试了各种桥接演员.我错过了一些明显的东西吗?

有任何想法吗?

谢谢!

Mar*_*ich 5

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

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

你需要使用objc_precise_lifetime使b整个上下文可用(ARC可能b在最后一次引用后发布)

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

NSString *b = [[NSString alloc] initWithString:@"hello"];
NSString *__strong*a;
a = &b;
Run Code Online (Sandbox Code Playgroud)