在一本书中,是这样说的:
那么你怎么知道一个对象什么时候拥有,由谁拥有呢?考虑以下示例:
NSString *str = [[NSString alloc] initWithString:@”Hello”]; NSString *str2 = str;
在此示例中,您使用
alloc
关键字 forstr
,因此您拥有str
。因此,您需要在不再需要它时释放它。但是,str2
只是指向str
,因此您不拥有str2
,这意味着您使用完后无需释放str2
它。
我认为所有权是对象,而不是变量或指针......所以我们不能说我们“拥有str
”或“拥有”......我们拥有一个由orstr2
指向的对象,如果我们使用or ,都是一样的。str
str2
[str release]
[str2 release]
另一种描述是:
例如,考虑上一节中使用的示例:
NSString *str = [[NSString alloc] initWithString:@”Hello”]; NSString *str2 = str; [str release]; [str2 release]; //---this is not OK as you do not own str2---
尝试释放
str2
将导致运行时错误,因为您无法释放不属于您的对象。
[str2 release]
如果之前调用了它,我们实际上可以使用 它[str release]
。如果我们这样做,那么该行将[str release]
导致错误,因为 nowstr
和str2
都是悬空指针,并且假设release
第一次发送到对象时,引用计数变为 0,并dealloc
立即被调用,并且内存被释放由 C 函数free()
。
以上是否正确,或者还有其他需要更正的地方?