ARC所有权限定词的位置是否重要?

3

苹果公司通常会给出这样的例子:

NSError __strong *error = nil;

或者
-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;

我认为如果我这样做,它会更易读、更合乎逻辑:

__strong NSError *error = nil;


-(BOOL)performOperationWithError:(__autoreleasing NSError**)error;

一个快速测试显示编译器对我的写法没有抱怨。不管怎样,我是在做错了吗,还是这样写就可以呢?

2个回答

4
不,所有权修饰符的位置都无关紧要。因为所有权修饰符只对指向对象的指针类型有意义,所以你的意图从未有歧义。编译器可以轻松地确定你的意图在哪里,所以ARC就是这样做的。
如果您可以访问iOS Apple开发者论坛,则可以看到我向苹果工程师询问了同样的问题https://devforums.apple.com/message/458606

虽然在这种情况下似乎并不重要,但如果您将其放在正确的位置可能会更好。例如,const T * *T * const *不同的,因此为什么在__autoreleasing上做错呢,只是因为编译器会修复位置? - CRD
不是编译器会修复它,而是在这种情况下它们都是同样有效的并且意思相同。你说的对,在const的情况下确实有所区别。但在这里,没有。这是一个错误的类比。 - BJ Homer

1

如果编译器没有抱怨,并且由于此原因您没有任何新的泄漏,那么就很好了。您还可以比较一种方式与另一种方式的汇编输出,看看是否有任何差异(使用diff工具,而不是TextEdit,否则您会整夜都在这个问题上 :P)

如果汇编或二进制文件相同,则编译器将完全相同地处理它。您还可以在之前和之后使用Instruments进行测试,以查看是否有任何泄漏,以确保它仍然正确处理内存。


希望这可以帮到你:https://dev59.com/82035IYBdhLWcg3wZ_Qt - Tim

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