【发布时间】:2011-09-06 23:28:07
【问题描述】:
作为 Cocoa/Obj-C 的新手,我正在阅读 Aaron Hillegass 的“Mac OS X 的 Cocoa 编程”一书 - 撇开这样一个事实,即现在我们也有机会使用 GC 来避免所有这些推理 -我不确定我是否明白其中一些保留的原因。
特别是在 Aaron 给出的一个很好的编程实践示例中:
- (void) setFoo:(NSCalendarDate *)x
{
[x retain];
[foo release];
foo = x;
}
我不明白在方法的第一行保留 x 实例的原因:
[x retain];
这个实例的作用域只是 set 方法,对吧? 退出方法范围时,无论如何都应该释放 x 实例,不是吗? 此外,当将 x 分配给 foo 时:
foo = x;
foo 无论如何都会指向 x 个内存单元,因此会增加指向的对象保留计数,不是吗?这应该确保内存不会被释放。
那么,有什么意义呢?当然,我确信我错过了一些东西,但不知道到底是什么。
谢谢, 法布里奇奥
【问题讨论】:
-
附带说明,这里的代码实际上突出了一个好的实践。在某些情况下,“x”和“foo”可能已经指向同一个对象。在这种情况下,如果您遵循典型的 setter 流程 '[foo release],然后 foo = [x retain]',那么您将首先释放 'x'/'foo' (),然后再次保留它。如果在调用“setFoo:”时对象的保留计数为“1”,则意味着“x”/“foo”首先被释放,然后释放的对象被传递“保留”消息。而是按照 Aaron 的流程,在释放 'foo' 之前先保留 'x',避免了这个问题。
标签: objective-c cocoa memory-management retaincount