Как правильно вернуть NSArray объектов в Objective-C? - PullRequest
2 голосов
/ 11 июля 2011

У меня есть метод, который должен вернуть массив объектов.Теперь это происходит так:

  1. Создайте NSMutableArray*
  2. Каждый объект после некоторого вычисления имеет вид alloc -d и init -ed
  3. Каждый объект после инициализации добавляется в массив с помощью addObject
  4. Возвращается массив

Является ли автоматическое освобождение массива правильным решением?Как насчет объектов внутри массива?Когда они должны быть выпущены?

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

Да, установка массива на autorelease перед возвратом - разумное решение. Кроме того, если вы вызываете alloc и init для вещей, которые вы помещаете в массив, вы должны вызывать release (или autorelease) для каждого после добавления его в массив. Ваши объекты будут сохраняться до тех пор, пока они находятся в массиве. Удаление их из массива (или освобождение массива) приведет к их освобождению.

3 голосов
/ 11 июля 2011

Ваш метод должен установить для массива значение autorelease, а затем вызывающая сторона должна сохранить возвращенный массив. Таким образом, метод больше не отвечает за массив, вызывающая сторона.

Объекты в массиве будут сохранены NSMutableArray, поэтому вы должны установить для них автоматическое освобождение, чтобы они не протекали.

- (NSMutableArray*) calleeMethod
{
    // this method is retaining the array temporarily
    // someone else is responsible for retaining it
    NSMutableArray * newArray = [[[NSMutableArray alloc] init] autorelease];

    // add some objects
    for (int i = 0; i < 10; i++)
    {
        // autorelease these objects because newArray will retain each item and 
        // is responsible for the items
        FooObject * newFooObject = [[[FooObject alloc] initWithNumber:i] autorelease];
        [newArray addObject:newFooObject];
    }

    return newArray;
}

- (void) callerMethod
{
    // retain the returned array, because we own it 
    mNewArray = [[self calleeMethod] retain];

    // do stuff 

    // make sure you explicitly release mNewArray later (probably in the dealloc)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...