Вы отпускаете объект, который возвращается в функции? - PullRequest
1 голос
/ 23 сентября 2011

Это для iPhone-приложения, написанного на Objective-C с использованием Xcode 4.

Быстрый вопрос: если у вас есть функция, которая возвращает NSArray, который был ALLOC'ed в этой функции, нужно ли вамвыпустить его?

Вот более подробный вопрос.

Я запускаю «Анализ» в своем приложении для iPhone, и он жалуется на возможную утечку памяти в одной из моих функций

Функция создает NSArray из NSMutableArray и возвращает NSArray.Что я делаю, так это беру NSMutableArray объектов класса и создаю NSArray NSStrings из них.Я максимально упростил код, чтобы показать проблему, поэтому не беспокойтесь, если он выглядит так, как будто он ничего не делает.

-(NSArray *)encodeArray
{
    // I use a NSMutableArray here because I do not know how big the starting
    // array will be (I hard coded the 20 here for now)
    NSMutableArray *tmp = [[NSMutableArray alloc]init ];

    for (int y = 0;y<20;y++) {
        // create the NSString object and add it to the tmp array
        NSString *cardcount = [NSString stringWithFormat:@"%i%",y];
        [tmp addObject:cardcount];
    }
    // create the array we will be returning out of the NSMutableArray
    NSArray *array = [[NSArray alloc] initWithArray:tmp copyItems:YES];
    // release the tmp array we created.
    [tmp release];

    // return our array
    // This is the location of the potential memory leak.  SHOULD I RELEASE THIS
    // If I DO - HOW DO I RETURN IT.
    return array;
}

Нужно ли освобождать массив?Если так, как я могу все еще возвратить это?Может быть, есть лучший способ выполнить то, что я делаю?

Общая цель - создать NSArray, чтобы я мог использовать NSUserDefaults для сохранения состояния приложения.

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

Как правило, в этом случае вы хотите вернуть автоматически освобожденный массив.Если вы отпускаете его в своей функции, он будет освобожден до того, как у вашего абонента будет возможность сохранить свою собственную копию.Если вы не выпустите его автоматически, то, когда ваш вызывающий объект сохранит возвращенный объект, у вас будет счетчик сохранения 2, и он может протечь.

Итак, просто измените свой оператор возврата на следующее:

return [array autorelease];
1 голос
/ 23 сентября 2011

Как правило; если вы (под вами я имею в виду текущую область видимости объекта) сохраняете / копируете / etc объект, то вы должны его где-то выпустить / автоматически освободить Поскольку тот, кто звонит encodeArray, не делал сохранение на array, он не несет ответственности за его освобождение. Следовательно, перед возвращением его необходимо настроить на автоматическое освобождение:

-(NSArray *)encodeArray
{
    // I use a NSMutableArray here because I do not know how big the starting
    // array will be (I hard coded the 20 here for now)
    NSMutableArray *tmp = [[NSMutableArray alloc] init];

    for (int y = 0;y<20;y++) {
        // create the NSString object and add it to the tmp array
        NSString *cardcount = [NSString stringWithFormat:@"%i%",y];
        [tmp addObject:cardcount];
    }

    // create the array we will be returning out of the NSMutableArray
    // Named initializers indicate that the object will be autoreleased:
    NSArray *array = [NSArray arrayWithArray:tmp];

    // release the tmp array we created.
    [tmp release];

    // return our array
    return array;
}

Или:

-(NSArray *)encodeArray
{
    // I use a NSMutableArray here because I do not know how big the starting
    // array will be (I hard coded the 20 here for now)
    NSMutableArray *tmp = [[NSMutableArray alloc] init];

    for (int y = 0;y<20;y++) {
        // create the NSString object and add it to the tmp array
        NSString *cardcount = [NSString stringWithFormat:@"%i%",y];
        [tmp addObject:cardcount];
    }
    // create the array we will be returning out of the NSMutableArray
    NSArray *array = [[NSArray alloc] initWithArray:tmp];

    // release the tmp array we created.
    [tmp release];

    // return our array
    return [array autorelease];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...