【问题标题】:Releasing an NSString that I am done with causes a crash释放我完成的 NSString 会导致崩溃
【发布时间】:2011-06-07 19:44:50
【问题描述】:

注意下面注释掉的[printvolfirst release]; 行。如果我取消注释,程序就会崩溃。我不知道为什么。 printvolfirst 变量不会在其他任何地方使用,除了您在此处看到的代码行。将其分配给printvol 后,我就完成了。那么为什么不发布呢?

vol = vol / 1000000;
NSNumberFormatter * format = [[NSNumberFormatter alloc] init] ;
[format setPositiveFormat:@"#.#"];
NSString * printvolfirst = [[NSString alloc]init];
printvolfirst = [format stringFromNumber:[NSNumber numberWithFloat:vol]];

NSString * printvol = [[NSString alloc] initWithFormat: @"%@M", printvolfirst];

self.Pop.vol.text = printvol;
[printvol release];
//[printvolfirst release];
[format  release];

【问题讨论】:

    标签: objective-c cocoa memory-management nsstring


    【解决方案1】:

    stringFromNumber: 自动释放返回的对象。如果你再次释放它,它会在它被释放后被释放。

    事实上,你甚至不需要这段代码:

    NSString*printvolfirst=[[NSString alloc]init];
    

    您可以在构建设置中打开“运行静态分析器”以收到有关此类事情的警告。

    【讨论】:

    • 有趣。如果我直接使用 alloc/init,我认为我“拥有”这个变量,并且我拥有它,直到我释放它。不对?如果我想保留 printvolfirst,而不是自动释放它,我该怎么做?
    • 您可以通过发送retain 消息来保留它。确实,当您 allocretaincopy 一个对象时,您就拥有了它。但是你正在做的是分配一个对象,然后将它设置为一个新对象,立即引入内存泄漏。如果您启用分析器,它应该准确地告诉您您做错了什么。 :)
    • @andrewjs:你缺少的关键是你不拥有变量——你拥有对象。您最初为变量分配了一个空字符串(您拥有该字符串),然后将该字符串丢弃并分配stringFromNumber: 的结果(您不拥有该字符串)。这是两个不同的对象。将它们存储在同一个变量中不会改变它们的内存管理要求。
    【解决方案2】:

    您正在释放 autoreleased 字符串。尽管您正在执行NSString*printvolfirst=[[NSString alloc]init];,但是当您执行printvolfirst=[format stringFromNumber:[NSNumber numberWithFloat:vol]]; 并在其中将自动释放的对象分配给printvolfirst 时,您将丢失对该对象的引用。在此过程中,您还创建了内存泄漏。你不必释放它。

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多