Большая утечка в категории Objective-C - PullRequest
0 голосов
/ 15 ноября 2010

Я создал собственную категорию NSString, которая позволяет мне находить все строки между двумя другими строками. Теперь я сталкиваюсь с проблемой обнаружения большого количества килобайт, вытекающих из моего скрипта. Пожалуйста, смотрите код ниже:

    #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 ]

3 голосов
/ 15 ноября 2010

Нет, это линия, которая протекает:

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

И это не такая большая утечка (просто пустой изменяемый массив). Тем не менее, не делай этого.

В частности, строка:

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

Присваивает ссылку на пустой изменяемый массив.

Также FinalArray должно быть названо finalArray.

1 голос
/ 15 ноября 2010

finalArray подтекает.Вы должны автоматически выпустить его перед возвратом, но убедитесь, что вы делаете это либо перед распределением пула автоматического выпуска, либо после его освобождения.

...