【问题标题】:Does the position of the ARC ownership qualifier matter?ARC所有权限定符的位置重要吗?
【发布时间】:2012-01-14 19:23:10
【问题描述】:

苹果倾向于给出这样的例子:

NSError __strong *error = nil;

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

如果我可以这样做,我会发现它更具可读性和逻辑性:

__strong NSError *error = nil;


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

快速测试表明编译器并没有抱怨我的编写方式。是不是我做错了,还是这样写就好了?

【问题讨论】:

    标签: objective-c ios macos syntax automatic-ref-counting


    【解决方案1】:

    不,所有权限定符的位置根本不重要。由于所有权限定符仅对指向对象类型的指针有意义,因此您的意图永远不会模棱两可。无论您将其放置在何处,编译器都可以轻松找出您的意图,因此 ARC 正是这样做的。

    如果您可以访问 iOS Apple 开发者论坛,那么您可以在https://devforums.apple.com/message/458606 看到我在哪里向 Apple 工程师提出了同样的问题。

    【讨论】:

    • 虽然在这种情况下显然无关紧要,但如果你把它放在正确的地方可能会更好。例如。 const T * * NOTT * const * 相同,那么为什么 __autoreleasing 会因为编译器会修复放置而出错?
    • 不是编译器会修复它;就是在这种情况下,它们都同样有效并且都意味着同样的事情。你是对的,在const 的情况下它会有所不同。在这里,它没有。这是一个错误的类比。
    【解决方案2】:

    如果编译器没有抱怨,并且您没有因此而得到任何新的泄漏,那很好。您还可以从一种方式与另一种方式比较您的程序集输出,看看是否有任何差异(使用 diff 工具,而不是 TextEdit,否则您将整晚都在使用它:P)

    如果 asm 或二进制文件相同,则编译器会以完全相同的方式对待它。您还可以在前后使用 Instruments 进行测试,看看是否有任何泄漏,以确保它仍然可以正确处理内存。

    【讨论】:

    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2015-01-20
    • 2017-06-03
    • 1970-01-01
    相关资源
    最近更新 更多