内存泄漏
我有这个在我的代码:内存泄漏
NSString *myString = @"";
....
if (...) {
myString = @" other string";
}
...
myString = @" an other string ";
这是一个泄漏,请?
对不起,伙计们,但它不是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:
编译器使得这样的对象中每一个模组 基础上 常数独特的,他们永远不会释放, 虽然你可以保留并释放他们 当你做任何其他对象。
不,这不是一个泄漏这将是autorelease
你不太对,看看我的答案。 – 5hrp 2011-05-11 12:49:49
是锋利是正确的......你错了一点.. – 2011-05-11 12:57:41
这是不泄漏。只有在分配内存并且不释放内存时才会泄漏内存。
在你的情况下,你创建的是一个自动释放的对象。他们将在稍后发布。
不,它不是自动释放对象 – 5hrp 2011-05-11 12:59:55
当您通过使用alloc init
或new
,retain
或mutablecopy
方法分配对象并随后不释放它们而获取对象的所有权时会泄漏内存。然后它会导致泄漏。看看Object Ownership
您拥有您创建的任何对象。
你“创造”使用名称以“黄金”, “新”,“复制”,或“mutableCopy”(对于 例如,分配,NEWOBJECT,或 mutableCopy)的方法的对象。
您可以使用retain获取对象的所有权。
请记住,对象可能有多个所有者。取得对象的所有权 是你说 你需要它保持活着的方式。 (这是更详细地讨论 “存取方法。”)
你必须放弃你自己,当你完成 与他们的对象的所有权。
你通过发送释放消息 或一个自动释放消息放弃对象的所有权(自动释放 被更详细地 “自动释放”中讨论)。在Cocoa术语中,放弃对象 的所有权因此通常被称为 “释放”对象。
您不得放弃您不属于自己的物体的所有权。
这主要是以前的政策 规则的隐含推论,作出明确规定。
它不是自动释放,看我的答案 – 5hrp 2011-05-11 12:50:32
+1:是啊......他们都存储在一个常量池(不自动发布的池),如果你检查它们的保留数,它是整数可以容纳的最大值。 – 2011-05-11 12:59:27