在Objective-C中调用对象的释放是否正确?

时间:2011-10-11 20:49:08

标签: objective-c memory-management memory-leaks

我是Objective-C的新手,我在理解内存管理方面遇到了一些困难。

因此,假设我有一个类和NSString *类型的实例变量,它没有绑定到属性。这种情况会泄漏记忆吗?

myString = [[NSString alloc] init]; 
//more program stuff
myString = [[NSString alloc] init];

在将myString设置为新对象之前,我应该调用[myString release]吗?这种代码会泄漏内存吗?每次指针指向不同的对象时,是否必须释放这样的对象?

4 个答案:

答案 0 :(得分:2)

首先,Apple的Memory Management Programming Guide是查找有关内存管理的示例和说明的好地方。

现在回答你的问题。当您调用myString = [[NSString alloc] init];时,您将重新分配指针myString,因此无法访问原始NSString,从而造成内存泄漏。

这里的一般经验法则是,对于每个alloc,您应该有一个release,这些必须适当地交替。如果你这样做

myString = [[NSString alloc] init]; 
// ...
myString = [[NSString alloc] init];
// ...
[myString release];
[myString release];

您要释放两次相同的实例,这会导致过度释放和错误BAD-ACCESS。正确的做法是

myString = [[NSString alloc] init]; 
// ...
[myString release];
myString = [[NSString alloc] init];
// ...
[myString release];

以便正确释放每个实例。

答案 1 :(得分:2)

对于将来,请坚持使用alloc / copy / retain每个release配对的简单规则。

答案 2 :(得分:1)

是的,这会泄漏。

通过为同一个变量NSString分配和分配另一个myString实例,您将失去对myString的原始内容的引用,从而无法向其发送发布消息。
Clang静态分析仪和Leaks仪器都应该发现这种泄漏。

答案 3 :(得分:1)

是的,在重新分配变量以指向第二个对象之前,需要释放第一个对象。否则,您将丢失对第一个对象的跟踪并将其泄漏,因为您无法释放它。您负责释放该对象,因为您创建了(通过alloc),如Memory Management Rules中所述。

另外,请记住[[NSString alloc] init]正在创建一个空且不可变的字符串NSString是不可变的,这意味着它们在创建后无法更改)。这样做没什么意义。