如何在iOS7中安全地释放NSMutableString

问题描述:

-(void)showLog 
{ 
    NSMutableString* msgStr = nil; 

    msgStr = [NSMutableString stringWithFormat:@"%s","Log :"]; 

    //show Log 

    [msgStr release]; 

} 

这是我的代码。我经常从一个线程调用这个函数。我禁用了ARC,并且正在使用xcode 5在iOS Mini上测试iPad Mini。在XCode 5中,它显示连续的内存分配。即使我释放这msgStr为什么它显示内存分配增量?如何在iOS7中安全地释放NSMutableString

任何帮助或建议将是伟大的。

+1

请解释一下你的意思通过“显示连续内存分配”。 – trojanfoe

+2

您正在过度释放字符串。我不认为你正确理解内存情况。 – Chuck

+0

我在我的线程中有一个while循环。在每次迭代中,我都会调用这个方法。每次它显示我的应用程序分配的内存更高的计数。 – sam18

stringWithFormat:返回自动发布NSString,因此您将其过度发布。它没有泄漏。内存分配将始终发生,如果不再发布或泄漏,这只会是一个问题。

你如何检查内存分配?你在使用仪器吗?

+0

最初,我使用'stringWithFormat',它显示内存分配增量没有内存泄漏。 XCode 5在设备上运行应用程序时显示侧面板中的FPS,内存和CPU使用情况。 – sam18

+0

如果没有完整的代码,就不可能确定分配的内存是否增加。内存分配随着时间的推移会有各种各样的原因,例如,如果您在视图中显示日志文本并在最后追加新的日志条目。这必须增加拨款。 – Volker

+0

此变量的范围仅在此函数内。我没有把这个变量传递给任何函数。 – sam18

你在这里失踪

[NSMutableString stringWithFormat:@"%@",_someString]; 

该行创建一个自动释放的NSString对象,因为stringWithFormat是一个工厂方法,该方法返回一个类型的NSString的实例变量的地步。

在第二行中,您将发布它。无需在此处执行此操作,它将从自动释放池中释放。

+0

我没有在旧代码中释放该字符串,但它没有被释放,所以我尝试了手动释放。虽然它显示应用程序分配的总内存增量。我没有使用仪器,而是从xcode 5的左侧面板中观察FPS,内存和CPU – sam18

+0

'stringWithFormat:'从'NSMutableString'调用将创建一个'NSMutableString'。那部分没有错。 – Desdenova

+0

@ sam18你的字符串将会在autorelease池被释放时被释放。所以你不需要担心它的内存分配。 – Pawan

如果你想自我释放你NSString情况下,像这样做:

-(void)showLog 
{ 
    NSMutableString* msgStr = nil; 

    msgStr = [[NSMutableString alloc] initWithFormat:@"%s", "Log :"]; 

    //show Log 

    [msgStr release]; 
} 

如果不改变msgStr使用一个不变的字符串类型:

-(void)showLog 
{ 
    NSString* msgStr = [[NSString alloc] initWithFormat:@"%s", "Log :"]; 

    //show Log 

    [msgStr release]; 
} 
+0

你不需要再对'NSString'上的'alloc init'进行操作。 – Popeye

+0

@Popeye提问者禁用ARC,所以如果不应该使用自动释放池,那么无法绕过alloc/init ... – Jensemann

+0

@Popeye:你是什么意思“你不需要alloc/init NSString”? - 当然,为了更好地控制生命周期而不是自动释放对象,可以明确地分配/初始化一个对象并明确释放它。 –