【发布时间】:2012-05-13 13:02:14
【问题描述】:
在一本书中是这样说的:
那么,您如何知道一个对象何时拥有,以及由谁拥有?考虑 下面的例子:
NSString *str = [[NSString alloc] initWithString:@”Hello”]; NSString *str2 = str;在此示例中,您将
alloc关键字用于str,因此您拥有str。 因此,您需要在不再需要它时释放它。然而,str2只是指向str,所以你不拥有str2,这意味着你 使用完毕后无需释放str2。
我认为所有权是对象,而不是变量或指针...所以我们不能说我们“拥有str”或“拥有str2”...我们拥有一个对象,它由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将导致运行时错误,因为您 无法释放不属于您的对象。
如果在[str release] 之前调用,我们实际上可以使用[str2 release]。如果我们这样做,那么[str release] 行将导致错误,因为现在str 和str2 都是悬空指针,并且假设当release 第一次发送到对象时,引用计数变为0,并立即调用dealloc,并由C函数free()释放内存。
以上是否正确,或者还有什么需要更正的地方?
【问题讨论】:
-
+1,但考虑在新代码中使用ARC。
-
你是对的。这本书要么非常混乱,要么完全错误。
-
顺便问一下这是什么书?
标签: objective-c