Автозапущенный NSMutableArray не заполнен - PullRequest
3 голосов
/ 12 мая 2011

Я хочу заполнить массив следующим образом:

NSMutableArray *array = [self methodThatReturnsAnArray];

В методе methodThatReturnsAnArray я создаю массив, подобный этому:

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

Когда я закончу заполнять "arrayInMethod", я возвращаю массив и для предотвращения утечки памяти использую:

return [arrayInMethod autorelease];

Однако переменная «массив» никогда не заполняется. При удалении "autorelease" все работает нормально, хотя. Что я должен сделать, чтобы убедиться, что возвращенный объект я выпустил?

EDIT

+ (NSMutableArray *)buildInstants:(NSArray *)huntsArray {

    NSMutableArray *goGetObjects = [[[NSMutableArray alloc] init] autorelease];

    for (int i = 0; i < [huntsArray count]; i++) {

        NSDictionary *huntDict = [huntsArray objectAtIndex:i];

        PHGoGet *goGet = [[PHGoGet alloc] init];

        goGet.title = [huntDict objectForKey:@"title"];
        goGet.description = [huntDict objectForKey:@"description"];
        goGet.start = [huntDict objectForKey:@"start"];
        goGet.end = [huntDict objectForKey:@"end"];
        goGet.ident = [huntDict objectForKey:@"id"];

        if ((CFNullRef)[huntDict objectForKey:@"image_url"] != kCFNull) {

            goGet.imageURL = [huntDict objectForKey:@"image_url"];

        } else {

            goGet.imageURL = nil;
        }

        if ((CFNullRef)[huntDict objectForKey:@"icon_url"] != kCFNull) {

            goGet.iconURL = [huntDict objectForKey:@"icon_url"];

        } else {

            goGet.iconURL = nil;
        }

        goGet.longitude = [huntDict objectForKey:@"lng"];
        goGet.latitude = [huntDict objectForKey:@"lat"];
        goGet.companyIdent = [huntDict objectForKey:@"company_id"];

        [goGetObjects insertObject:goGet atIndex:i];
        [goGet release];
    }

    return [[goGetObjects copy] autorelease];
}

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Прежде всего, я рекомендую вам не возвращать NSMutableArray из любого метода. Для этого лучше использовать NSArray, чтобы избежать некоторых очень трудных для отладки проблем. Мое предложение:

Вы объявляете изменяемый массив и заполняете его:

NSMutableArray *arrayInMethod = [[[NSMutableArray alloc] init] autorelease];

Затем вы возвращаете автоматически выпущенную копию:

return [[arrayInMethod copy] autorelease];

И, наконец, когда вы берете возвращаемый массив, вы снова делаете его изменяемым (только если вам нужно его изменить):

NSMutableArray *array = [[self methodThatReturnsAnArray] mutableCopy];

Когда вы закончите работу с массивом, вы отпустите его:

[array release];
1 голос
/ 12 мая 2011

Попробуйте использовать метод соответствия для NSMutableArray ... изменить:

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

Для того, чтобы ...

NSMutableArray *arrayInMethod = [NSMutableArray array];

array вернет автоматически освобожденный объект.

...