我是Objective-C的新手,我在理解内存管理方面遇到了一些困难。
因此,假设我有一个类和NSString *类型的实例变量,它没有绑定到属性。这种情况会泄漏记忆吗?
myString = [[NSString alloc] init];
//more program stuff
myString = [[NSString alloc] init];
在将myString设置为新对象之前,我应该调用[myString release]
吗?这种代码会泄漏内存吗?每次指针指向不同的对象时,是否必须释放这样的对象?
答案 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
是不可变的,这意味着它们在创建后无法更改)。这样做没什么意义。