我们可以在Objective-c中释放一些变量不拥有但指向的内存吗?

时间:2011-03-31 10:46:26

标签: objective-c memory memory-management retaincount

我有一些像这样的代码:

NSObject *var1 = [[NSObject alloc] init];
NSObject *var2 = var1;
[var2 release]; 

var1 = nil;

这是正确的还是内存泄漏? 据我所知,只有var1可以释放第一行中的内存,根据Object Ownership policy

4 个答案:

答案 0 :(得分:2)

你的代码释放内存,因为只有一个alloc和一个发行版 - 对象的指针的数量不是一个因素。

所有权是Object Ownership policy所涉及的概念,因为如果您遵循指导原则,它可以更轻松地管理并最终防止与发布您不应发布的内容相关的问题(或不释放你应该的东西。)

答案 1 :(得分:0)

您的示例不会导致内存泄漏,因为var1var2指向内存中的同一对象 - 因此alloc调用具有匹配的release。如果保留NSObject,因为它已分配给var2,但会出现内存泄漏,因为没有匹配的release

当内存管理指南谈到所有权的概念时,并不意味着变量(例如var1)拥有一个对象;它更多的是“范围”拥有它(例如一个类或方法)。在您的示例中,包含这些语句的方法将负责释放对象。

答案 2 :(得分:0)

您的代码没问题,也没有泄露。但似乎你并不真正理解指针。指针不能拥有另一个对象,它只是一个引用,告诉计算机正在访问哪个对象。在Cocoa的引用计数内存模型中,根本没有多少指针指向单个对象。

在尝试学习Objective-C之前,你真的应该学习C(特别是关于指针)。

答案 3 :(得分:0)

这是保持引用计数的对象,而不是指向对象的指针。如果你有十几个指向对象的指针,你可以使用它们中的任何一个来释放对象,因为它们都指向同一个对象。但是,如果你不玩这类游戏,那么遵循你的代码并确保没有内存管理问题要容易得多。