ARC的Objective-C命名约定和可能的警告

Lor*_*o B 8 objective-c llvm-clang automatic-ref-counting

我有纯ARC编码的经验.作为一个编译器功能,它尊重Objctive-C方法系列,只要需要就设置正确的保留/释放调用.

所有以启动方法alloc,mutableCopy,copynew创建新的对象.它们增加了保留计数.因此,当我不再需要时,ARC将释放任何指针(以及与之关联的对象).

我认为当我编写不遵循命名约定的方法时,可能会出现问题.例如,如果我newCustomer在第一个版本中编写类似的方法返回自动释放的对象,而在第二个版本中则不会,会发生什么?

特别是,我的问题如下(它们属于同一推理):

  • 如果调用和被调用的代码都是用ARC编译的,会发生什么?
  • (a)如果使用ARC编译调用代码而使用非ARC编译调用时会发生什么?
  • (b)如果在使用ARC编译调用时使用非ARC编译调用代码会发生什么?

会意识到一个答案,显示ARC怎样在底层工作(下objc_release,objc_retainAutoreleasedReturnValue等).

先感谢您.

Car*_*zey 12

名为的方法newCustomer将属于new 方法系列,因此隐式标记为返回保留的对象.当使用ARC编译调用和被调用的代码时,ARC会使用调用者中的释放来平衡额外的保留:

从这样的函数或方法返回时,ARC在离开所有本地范围之前,在return语句的评估点保留该值.

当从这样的函数或方法接收返回结果时,ARC会在其包含的完整表达式的末尾释放该值,这取决于对本地值的通常优化.

资源

如果newCustomer使用手动引用计数实现并违反命名约定(即,不返回保留对象),则调用者可以过度释放或不释放,具体取决于具体情况.

如果调用者使用ARC,则返回的对象newCustomer将被过度释放 - 可能导致程序崩溃.这是因为调用代码将参与上述过程的后半部分,而没有在此之前执行相应的保留.

如果调用代码不是用ARC编译的,而是被调用的代码(因此正确实现了返回保留对象),那么行为取决于程序员遵循命名约定.如果它们释放返回的值,则将正确管理对象的引用计数.但是,如果程序员认为他们的new...方法确实违反了命名约定,并且无法在调用代码中手动插入版本,则返回的对象将泄漏.

总而言之,正如Martin R.在评论中指出的那样,关键的决定是在任何环境中是否遵循命名约定,包括手动引用计数.