我有纯ARC编码经验。 作为一个编译器功能,它给予荣誉Objctive-C方法的家庭把正确的保留/每当neeeded呼吁释放。
所有以启动方法alloc
, mutableCopy
, copy
和new
创建新对象。 他们增加了保留计数。 因此,ARC将发布(与它相关联,因此对象)的任何指针,当我不再需要它。
我想,当我写不遵循命名约定的方法可能会出现问题。 例如,如果我写这样的方法newCustomer
而在第二个版本,在第一个版本返回一个自动释放的对象不,会发生什么?
特别是,我的问题有以下几方面(它们属于同一个道理):
- 如果主叫和被叫的代码都与ARC编译,会发生什么?
- (一)如果调用代码与ARC编译,而所谓的与非ARC编译,会发生什么?
- (二)如果调用代码与非ARC编译而被叫与ARC编译,会发生什么?
会意识到一个答案,显示ARC怎样在底层工作(下objc_release
, objc_retainAutoreleasedReturnValue
等)。
先感谢您。
命名为A方法newCustomer
将落入内new
方法家族 ,并且因此隐含地标记为返回一个保留对象。 当两个主叫方和被叫代码与ARC编译,然后ARC平衡与主叫方释放额外保留:
当从这样的函数或方法返回,ARC保留在返回语句评价点留下的所有本地范围之前的值。
当接收到来自这样的功能或方法的返回结果,ARC释放在完全表达它包含内,经受用于本地值的通常的优化结束时的值。
资源
如果newCustomer
与手动引用计数实现,并且违反了命名约定(即,不返回保留对象),则主叫方既可以在释放或释放下,视情况而定。
如果呼叫者使用ARC,然后从返回的对象newCustomer
将overreleased -可能导致程序崩溃。 这是因为调用代码将参加在上述方法的第二个一半,而不必有对应挽留在这之前进行。
如果调用代码没有与ARC编译,但所谓的代码是(因此正确地实现返回保留的对象),则行为取决于以下的命名约定程序员。 如果他们释放返回的值,则该对象的引用计数将正确的管理。 不过,如果程序员认为,他们的new...
方法不违反命名约定,并不能手动插入调用代码释放,然后返回的对象会泄漏。
总而言之,正如马丁R.在评论中指出,关键决心是命名约定是否遵循包括手工引用计数的环境。
就像任何其他的语言,当你违背了一些你漫步进入未定义行为的区域语言的基本假设。 在未来的某个时候,苹果可能修改如何的内部-new...
确实引用计数。 它是由苹果以确保代码符合预期使用的作品,但他们不会做,对于不符合要求的用途。
如果您需要了解实际的行为是什么编译器运行的特定版本的特定系统上,那么你必须测试它。 不要以为这种行为将是为其他编译器或运行时的版本相同。
最后,不确定的行为是不确定的行为。 当你创建代码依赖于它,你将最终被一个微妙和困难的影响诊断缺陷。