2011-05-11 293 views
0

我有这个在我的代码:内存泄漏

NSString *myString = @""; 
.... 

if (...) { 
myString = @" other string"; 
} 
... 
myString = @" an other string "; 

这是一个泄漏,请?

回答

4

对不起,伙计们,但它不是autoreleased。它不泄漏,但它不是自动释放。这段代码证明这一点:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSString *str1 = @"First one"; // 
NSString *str2 = [NSString stringWithFormat:@"The %dnd", 2]; // this autoreleasing string 
[pool drain]; 

NSLog(@"%@", str1); // All's ok 
NSLog(@"%@", str2); // EXC_BAD_ACCESS 

阅读有关与@"..."建设创建的字符串在Strings PRogramming Guide

编译器使得这样的对象中每一个模组 基础上 常数独特的,他们永远不会释放, 虽然你可以保留并释放他们 当你做任何其他对象。

+0

+1:是啊......他们都存储在一个常量池(不自动发布的池),如果你检查它们的保留数,它是整数可以容纳的最大值。 – 2011-05-11 12:59:27

2

不,这不是一个泄漏这将是autorelease

+1

你不太对,看看我的答案。 – 5hrp 2011-05-11 12:49:49

+0

是锋利是正确的......你错了一点.. – 2011-05-11 12:57:41

1

这是不泄漏。只有在分配内存并且不释放内存时才会泄漏内存。

在你的情况下,你创建的是一个自动释放的对象。他们将在稍后发布。

+0

不,它不是自动释放对象 – 5hrp 2011-05-11 12:59:55

1

当您通过使用alloc initnewretainmutablecopy方法分配对象并随后不释放它们而获取对象的所有权时会泄漏内存。然后它会导致泄漏。看看Object Ownership

您拥有您创建的任何对象。

你“创造”使用名称以“黄金”, “新”,“复制”,或“mutableCopy”(对于 例如,分配,NEWOBJECT,或 mutableCopy)的方法的对象。

您可以使用retain获取对象的所有权。

请记住,对象可能有多个所有者。取得对象的所有权 是你说 你需要它保持活着的方式。 (这是更详细地讨论 “存取方法。”)

你必须放弃你自己,当你完成 与他们的对象的所有权。

你通过发送释放消息 或一个自动释放消息放弃对象的所有权(自动释放 被更详细地 “自动释放”中讨论)。在Cocoa术语中,放弃对象 的所有权因此通常被称为 “释放”对象。

您不得放弃您不属于自己的物体的所有权。

这主要是以前的政策 规则的隐含推论,作出明确规定。

+1

它不是自动释放,看我的答案 – 5hrp 2011-05-11 12:50:32