在Objective-C类别中大量泄漏

时间:2010-11-15 06:41:48

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

我创建了一个自定义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];

手动释放第二个列表会引发异常。

提前致谢!

2 个答案:

答案 0 :(得分:3)

不,这是泄漏的行:

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

并不是那么大的漏洞(只是一个空的可变数组)。不过,不要这样做。

特别是,行:

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

通过引用分配空的可变数组。

FinalArray也应命名为finalArray

答案 1 :(得分:1)

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