【问题标题】:how to free NSMutableString safely in iOS7如何在 iOS7 中安全地释放 NSMutableString
【发布时间】:2014-01-31 08:42:38
【问题描述】:
-(void)showLog
{
    NSMutableString* msgStr = nil;

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

    //show Log

    [msgStr release];

}

这是我的代码。我经常从一个线程调用这个函数。我已经禁用了 ARC,并且我正在使用 xcode 5 的 iOS 7 在 iPad Mini 上进行测试。在 XCode 5 中,它显示了连续的内存分配。即使我发布了这个msgStr,为什么它会显示内存分配增加?

任何帮助或建议都会很棒。

【问题讨论】:

  • 请解释一下“显示连续内存分配”是什么意思。
  • 您过度释放了字符串。我认为您没有正确理解内存情况。
  • 我的线程中有一个 while 循环。在每次迭代中,我都会调用此方法。并且每次它显示我的应用程序分配的内存计数更高。
  • @Chuck,我也测试过没有[msgStr release]。这是我的旧实现。没有释放它显示相同的行为
  • 您应该阅读 Apple 的内存指南。你不释放你不拥有的对象。在您的情况下,您不拥有该对象。一般来说,大部分时间你并不拥有这些字符串。

标签: objective-c memory-management nsmutablestring


【解决方案1】:

你在这里错过的点

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

这一行创建了一个自动释放的nsstring对象,因为stringWithFormat是一个工厂方法,它返回一个nsstring类型的实例变量。

在第二行中,您正在释放它。这里不需要这样做,它将从自动释放池中释放。

【讨论】:

  • 我没有在旧代码中释放该字符串,但它没有被释放,所以我尝试手动释放。虽然它显示应用程序分配的总内存增加。我没有使用仪器,而是从 xcode 5 的左侧面板观察 FPS、内存和 CPU
  • stringWithFormat:NSMutableString 调用将创建一个NSMutableString。那部分没有问题。
  • @sam18 当自动释放池耗尽时,您的字符串将被释放。所以你不必担心它的内存分配。
【解决方案2】:

stringWithFormat: 返回一个自动释放的NSString,所以你过度释放了它。它没有泄漏。内存分配将一直发生,只有在不再释放或泄漏时才会出现问题。

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

【讨论】:

  • 最初我使用的是stringWithFormat,它显示内存分配增加而没有内存泄漏。 XCode 5 在设备上运行应用程序时在侧面板中显示 FPS、内存和 CPU 使用率。
  • 如果没有完整的代码,就无法确定分配的内存是否会增加。内存分配会随着时间的推移而增加的原因有多种,例如,如果您在视图中显示日志文本并且只是在末尾附加新的日志条目。这必须增加分配。
  • 这个变量的作用域只在这个函数内。我没有将此变量传递给任何函数。
  • stringWithFormat:NSMutableString 调用将创建一个NSMutableString。那部分没有问题。
  • @Desdenova 它不是关于字符串的可变性,而是关于内存持久性。 stringWithFormat: 是自动释放的。
【解决方案3】:

如果您想自行释放您的 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];
}

【讨论】:

  • 您不再需要在NSStrings 上执行alloc init
  • @Popeye 提问者禁用了 ARC,因此如果不应该使用自动释放池,则无法绕过 alloc/init...
  • @Popeye:“你不需要 alloc/init NSString”是什么意思? - 当然,分配/初始化一个对象并显式释放它以更好地控制生命周期而不是自动释放对象是有意义的。
  • 当我不那么忙的时候我会看看,但苹果公司已经声明你知道很长时间必须在NSString上做alloc init你可以做NSString *myStr = @"hello world";我会寻找Apple 为其发布的文档。
猜你喜欢
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2021-03-25
  • 1970-01-01
  • 2013-04-06
相关资源
最近更新 更多