设置使用 @property(retain) 声明的属性将保留和释放旧值,但不会在没有 self 的同一对象内设置属性。
调用为保留属性合成的 setter 方法将释放旧值并保留新值。直接设置 ivar,而不通过您的访问器,只会分配 ivar。它既不会保留也不会释放任何东西。self.foo = bar
正是。_ [self setFoo:bar]
无论做什么setFoo:
都会做(setFoo:
如上所述的合成保留版本的作品)。foo = bar
正是。_ foo = bar
方法内的所有对象(包括参数)在创建/传递时保留,在方法返回时释放。
这根本不是真的。它们既不保留也不释放。保留和释放不会神奇地发生。它一方面响应对alloc
, new
, copy
,的调用而发生,另一方面。使用点表示法只是可能有内部方法调用的简写。retain
release
retain
方法返回的对象不会被释放,而是会被返回到的方法释放,因为它是方法内部的局部变量。
这不是真的。方法返回的对象既不会被保留也不会被释放。alloc
按照惯例,带有new
或copy
在其名称中的方法将返回净 +1 保留。任何其他方法都将返回净 0 保留计数(对象上的自动释放与保留一样多)。“当前”保留计数将始终大于 0,否则无法返回对象。(这是对事实的轻微掩饰。如果存在私有保留,则任何一种情况下的保留计数都可能大于 1。但从调用者的角度来看,这是一种有用的思考方式。)
最好的地方是Practical Memory Management,它非常简洁地说明了这一切。内存管理编程指南的其余部分将提供更多示例。