【问题标题】:Need help fixing memory leak - NSMutableString需要帮助修复内存泄漏 - NSMutableString
【发布时间】:2012-07-15 13:26:13
【问题描述】:

一直在研究如何解决这个内存泄漏问题,但运气不佳。

首先是代码:

-(NSString *) randomizeHint:(NSString *) wordToShuffle{

    NSMutableString * outputstring = [NSMutableString stringWithCapacity:[wordToShuffle length]];
    NSMutableSet * usedNumberSet = [NSMutableSet setWithCapacity:[wordToShuffle length]];

    for (int i=0; i<[wordToShuffle length]; i++) {
        int randomnum = arc4random()%[wordToShuffle length];

        while ([usedNumberSet containsObject:[NSNumber numberWithInt:randomnum]]==YES) {
            randomnum = arc4random()%[wordToShuffle length];
        }

        [usedNumberSet addObject:[NSNumber numberWithInt:randomnum]];
        [outputstring appendFormat:@"%c",[wordToShuffle characterAtIndex:randomnum]];
    }

    CCLOG(@"outputstring is:%@",outputstring);
    return outputstring;

 }

仪器给了我以下信息:

Leaked Object = NSCFString, Responsible Library = Foundation, Responsible Frame = -[NSPlaceholderMutableString initWithCapacity:]

有什么想法吗?

提前致谢。

【问题讨论】:

  • 代码似乎正确。在这种情况下,NSMutableString 是自动释放的。你确定这个泄漏是在上面的代码中出现的吗?
  • 试试return [outputstring copy]?
  • 在我看来,如果你在任何地方泄漏一个对象,Instruments 会指向它被创建的位置。会不会是这个例程的调用者泄露了返回的字符串?
  • 感谢 cmets 伙计们。 InderKumarRathore - 我认为 NSMutableString 也是自动发布的,这就是难倒的原因。 ZhangChn - 我不想在这个方法之外显式地释放它,它是一个局部变量,所以副本不会为我做。 Phillips Mills - 是的,不幸的是,在仪器进入标准库之前,这是我代码中堆栈跟踪中的最后一个元素。

标签: ios memory-leaks cocos2d-iphone nsstring nsmutablestring


【解决方案1】:

您实际上并不需要使用可变字符串...尤其是因为您的返回类型是 NSString。只需使用 stringByAppendingFormat:

-(NSString *) randomizeHint:(NSString *) wordToShuffle{

    NSString * outputstring = @"";

    NSMutableSet * usedNumberSet = [NSMutableSet setWithCapacity:[wordToShuffle length]];

    for (int i=0; i<[wordToShuffle length]; i++) {
        int randomnum = arc4random()%[wordToShuffle length];

        while ([usedNumberSet containsObject:[NSNumber numberWithInt:randomnum]]==YES) {
            randomnum = arc4random()%[wordToShuffle length];
        }

        [usedNumberSet addObject:[NSNumber numberWithInt:randomnum]];

        // just set outputstring like so... no need to worry about a leaky mutable string then
        outputstring = [outputstring stringByAppendingFormat:@"%c",
                    [wordToShuffle characterAtIndex:randomnum]];
    }


    return outputstring;

}

【讨论】:

  • +1 以获得更好的行为(即,尽可能避免使用可变参数)。此外,如果您的泄漏 is 在这部分代码中,这可能会有所帮助。泄漏NSString对象真的很难。
  • 我会试一试并回复您。感谢您的帮助。
  • 有时我认为我需要一个 NSMutableString 并且每次我最终都会在以后重构它。很高兴我能帮上忙!
【解决方案2】:

查看返回的字符串在哪里使用。可能您正在保留它并解除分配保留字符串的对象,而无需先释放保留的字符串。 Instruments 仍会将这部分代码指向“泄露”的对象。最难的部分是找到“泄密者”。是的,你可以泄露一个字符串,我刚刚写了它的秘诀。

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多