内存泄漏我的字符串

时间:2011-05-11 12:22:57

标签: iphone

我的代码中有这个:

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

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

这是泄漏吗?

4 个答案:

答案 0 :(得分:4)

对不起,伙计们,但这不是自动释放的。它没有泄露,但它没有自动释放。这段代码证明了这一点:

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处了解使用@"..."构造创建的字符串:

  

编译器生成这样的对象   每个模块上唯一的常量   基础,他们永远不会被解除分配,   虽然你可以保留并释放它们   当你做任何其他对象时。

答案 1 :(得分:2)

这不是泄漏,autorelease

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

  

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

     

使用名称以“alloc”开头的方法“创建”对象,   “新”,“复制”或“mutableCopy”(for   例如,alloc,newObject或   mutableCopy)。

     

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

     

请记住,对象可能有多个所有者。取得所有权   一个对象是你的说法   你需要它来保持活力。   (这在下面有更详细的讨论   “访问者方法。”)

     

完成后,您必须放弃您拥有的对象的所有权   和他们一起。

     

您通过向对象发送释放消息来放弃对象的所有权   或自动释放消息(自动释放   将在下面详细讨论   “自动释放”)。在Cocoa术语中,   放弃对象的所有权   因此通常被称为   “释放”一个物体。

     

您不得放弃您不拥有的物品的所有权。

     

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