【问题标题】:Big time Leaking in Objective-C CategoryObjective-C 类别中的重大漏洞
【发布时间】:2011-05-10 01:57:18
【问题描述】:

我创建了一个自定义 NSString 类别,它可以让我找到其他两个字符串之间的所有字符串。我现在遇到的问题是发现我的脚本中有很多 kB 泄漏。请看下面的代码:

    #import "MyStringBetween.h"

@implementation NSString (MyStringBetween)

-(NSArray *)mystringBetween:(NSString *)aString and:(NSString *)bString;
{
    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];

    NSArray *firstlist = [self componentsSeparatedByString:bString];
    NSMutableArray *finalArray = [[NSMutableArray alloc] init];


    for (int y = 0; y < firstlist.count - 1 ; y++) {
        NSString *firstObject = [firstlist objectAtIndex:y];
        NSMutableArray *secondlist = [firstObject componentsSeparatedByString:aString];
        if(secondlist.count > 1){

            [finalArray addObject:[secondlist objectAtIndex:secondlist.count - 1]];
        }
    }

    [autoreleasepool release];

    return finalArray;
}
@end

我承认我不太擅长释放对象,但我相信 NSAutoreleasePool 会为我处理事情。

泄漏的行:

NSMutableArray *secondlist = [firstObject componentsSeparatedByString:aString];

手动释放 secondlist 会引发异常。

提前致谢!

【问题讨论】:

  • 顺便说一句,你的函数返回一个数组而不是一个字符串。
  • 另外,除非您在没有封装它的自动释放池的线程上调用此方法,否则您不需要仅为此方法创建一个新的自动释放池。如果您在主线程上调用它,您可能已经为您设置了一个。

标签: iphone objective-c memory-leaks categories nsautoreleasepool


【解决方案1】:

不,这是泄漏的行:

NSMutableArray *secondlist = [[NSMutableArray alloc] init];

而且泄漏并不大(只是一个空的可变数组)。不过,不要那样做。

特别是:

    secondlist = [[firstlist objectAtIndex:y] componentsSeparatedByString:aString];

正在分配对空可变数组的引用。

还应将FinalArray 命名为finalArray

【讨论】:

  • 请查看我的新代码。仪器将同一第二行标记为泄漏。通过“大泄漏”,在我自己的项目中,它导致了 40kB 泄漏。
  • 它不仅仅是一个空数组——对象是稍后添加的。它还会泄漏所有这些对象,因为数组保留了它们。 finalArray 也需要自动释放。
  • @Chuck 从风格上讲,finalArray 绝对应该是自动发布的。但是,作者可能会在方法之外发布它(尽管他们可能不会。)
【解决方案2】:

finalArray 正在泄漏。您应该在返回它之前自动释放它,但请确保在分配自动释放池之前或释放它之后执行它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多