【问题标题】:Dead Store and Potential Leak of NSString in XcodeXcode 中 NSString 的死存储和潜在泄漏
【发布时间】:2011-08-09 15:10:21
【问题描述】:

字符串一的位。使用以下代码(为示例简化)时,我不断收到有关死存储和潜在泄漏的通知:

int x = 0;
NSString *aString = [NSString alloc]init]; <-- value store to 'aString' during its     initialization is never read

if(x == 0)
{
  aString = @"This is a string set by x being 0";
} else
{
  aString = @"This is a string set by x being something else";
}

aTextLabelOutlet.text = aString;
[aString release];
<-- Potential leak of an object allocated online ... and stored into aString

我真的不明白这一点。它被分配一次,然后在使用后释放。它被初始化,然后总是有一些东西放入其中并且总是被读取。

它从未崩溃或实际上导致内存泄漏,所以我有点困惑。

【问题讨论】:

    标签: ios xcode memory-leaks


    【解决方案1】:

    您不应该为aString 分配NSString,因为您在if 部分中分配给aString

    这就够了:

    int x = 0;
    NSString *aString;
    
    if(x == 0)
    {
      aString = @"This is a string set by x being 0";
    } else
    {
      aString = @"This is a string set by x being something else";
    }
    
    aTextLabelOutlet.text = aString;
    

    【讨论】:

    • 非常感谢!那么这是否意味着:NSString *aString; aString = @"This is a string"; 等同于:NSString *aString = [[NSString alloc]initWithFormat:@"this is a string"];,但不需要 [aString release],因为没有显式调用 alloc?
    • @Richard Washington - AFAIK 是的
    【解决方案2】:

    问题是你已经分配了一个 NSString 但你没有释放它。您正在尝试释放您使用 aString = @"..." 代码分配的字符串。

    由于从未使用过对 aString 的第一次赋值,因此您不需要像其他答案中所述给 aString 一个值(由于字符串是静态分配的常量,因此它也不会释放)

    如果一个字符串确实有一个使用的值,你应该交换分配和释放。例如

    int x = 0;
    NSString *aString = [NSString alloc]init]; <-- value store to 'aString' during its     initialization is never read
    
    // do something with aString
    [aString release];
    
    if(x == 0)
    {
      aString = @"This is a string set by x being 0";
    } else
    {
      aString = @"This is a string set by x being something else";
    }
    
    aTextLabelOutlet.text = aString;
    

    或者我会使用自动释放的字符串,所以运行时会执行释放,即

    NSString *aString = [[[NSString alloc]init]autorelease];
    

    或更好地使用构造器类方法之一

    NSString *aString = [NSString string];
    

    【讨论】:

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