我有一些这样的代码:
NSObject *var1 = [[NSObject alloc] init];
NSObject *var2 = var1;
[var2 release];
var1 = nil;
这是正确的还是内存泄漏?据我所知,根据对象所有权政策,只有 var1 可以释放第一行中分配的内存
我有一些这样的代码:
NSObject *var1 = [[NSObject alloc] init];
NSObject *var2 = var1;
[var2 release];
var1 = nil;
这是正确的还是内存泄漏?据我所知,根据对象所有权政策,只有 var1 可以释放第一行中分配的内存
您的代码将释放内存,因为只有一个分配和一个释放 - 指向对象的指针数量不是一个因素。
所有权是对象所有权政策所讨论的一个概念,因为如果您遵循指南,它将更容易管理并最终防止与发布您不应该发布的内容(或不发布您应该发布的内容)相关的问题。
您的示例不会导致内存泄漏,因为var1
并var2
指向内存中的同一对象,因此该alloc
调用具有匹配的release
. 但是,如果NSObject
保留了分配给它的位置var2
,则会出现内存泄漏,因为没有匹配release
的 。
当内存管理指南谈到所有权的概念时,它并不意味着一个变量(例如var1
)拥有一个对象。它更多的是关于“范围”拥有它(例如类或方法)。在您的示例中,包含这些语句的方法将负责释放对象。
你的代码没问题,不会泄漏。但似乎您并不真正了解指针。指针不能拥有另一个对象,它只是告诉计算机正在访问哪个对象的引用。在 Cocoa 的引用计数内存模型中,有多少指针指向单个对象并不重要。
在你尝试学习 Objective-C 之前,你真的应该学习 C(尤其是指针)。
保持引用计数的是对象,而不是指向对象的指针。如果您有十几个指向一个对象的指针,您可以使用其中任何一个来释放该对象,因为它们都指向同一个对象。但是,如果您不玩这类游戏,那么遵循您的代码并确保您没有内存管理问题要容易得多。