在NSScanner类别方法中泄漏

时间:2010-03-17 13:20:45

标签: objective-c cocoa memory-leaks categories

我创建了一个NSScanner类别方法,用于显示乐器中的泄漏。


- (BOOL)scanBetweenPrefix:(NSString *)prefix 
                andSuffix:(NSString *)suffix 
               intoString:(NSString **)value
{
    NSCharacterSet *charactersToBeSkipped = [self charactersToBeSkipped];
    [self setCharactersToBeSkipped:nil];

    BOOL result = NO;

    // find the prefix; the scanString method below fails if you don't do this
    if (![self scanUpToString:prefix intoString:nil])
    {
        MY_LOG(@"Prefix %@ is missing.", prefix);
        return result;
    }

    //scan the prefix and discard
    [self scanString:prefix intoString:nil];

    // scan the important part and save it
    if ([self scanUpToString:suffix intoString:value]) // this line leaks
    {
        result = YES;
    }
    [self setCharactersToBeSkipped:charactersToBeSkipped];
    return result;
}

我认为这是我将值传递给方法的方式,但我不确定。这是一个小泄漏(32字节),但如果可以,我想做正确的事。提前谢谢。

2 个答案:

答案 0 :(得分:2)

我找到了答案。我有一个模型类使用上面的代码的结果,但忘了在dealloc方法中释放属性。我应该用乐器抓住它,但我不知道在哪里看。我在扩展详细信息中遇到了调用堆栈,它只有我需要的部分信息。

对于像我这样的蠢货,这就是我的所作所为:

  1. 使用Instruments运行您的应用程序......泄漏。
  2. 在仪器中,观察泄漏的块视图(底部的网格图标)并打开扩展的细节。
  3. 如果您有多个泄漏的对象,请单击显示三角形,以便查看离散地址。
  4. 在地址旁边,会有一个详细箭头。点击它。
  5. 现在你将看到历史。它从Malloc开始,向您展示每个保留和释放。
  6. 您应该拥有malloc的版本以及历史记录中每个保留的版本。匹配您的保留和发布,并寻找奇怪的球。如有疑问,请查看页面底部,仔细查看您可能忘记在dealloc方法中发布的任何属性。

答案 1 :(得分:0)

好的,我很蠢。这种方法不会泄漏。漏洞比我的调用堆栈更远,但我无法弄清楚在哪里。对不起,过早的帖子。当我弄清楚真正的泄漏在哪里时,如果我自己无法弄清楚这个问题,我会跟进。

在回答Yuji的评论时,我的方法是:


    NSString *title;
    [fileScanner scanBetweenPrefix:kTitlePrefix 
                         andSuffix:kTitleSuffix 
                        intoString:&title];

这是&标题是问题吗?我在现有的NSScanner方法和调用之后对其进行了构建。