Объект автоматического освобождения, возвращенный из NSMutableArray

#iphone #ios #memory-management

#iPhone #iOS #управление памятью

Вопрос:

Когда метод возвращает объект, который взят из NSMutableArray, должен ли объект быть автоматически выпущен? Проверьте следующий метод. Также должен ли я автоматически возвращать нулевое значение?

 -(NSObject*)getElementByID:(NSString*)ID{

    for(int i=0;i<[elements count];i  ){
        NSObject *element = (NSObject*) [elements objectAtIndex:i];

        if([element.key isEqualToString:ID]){
            return [element autorelease];
        }
    }

    return nil;
}
  

Ответ №1:

Вы не должны выполнять авторелиз element , потому что вы не являетесь его владельцем (вы не установили для него сохранение). Вы бы стали его владельцем, если бы приобрели его с помощью alloc , new или retain . Поскольку вы приобрели этот объект при вызове objectAtIndex: , он вам не принадлежит. Смотрите на три волшебных слова. Вызов autorelease здесь приведет к сбою, который позже приведет к избыточному выпуску.

Ваше имя метода неверно и нарушает KVC. Метод, начинающийся с get , должен принимать указатель, который будет обновлен с результатом. Это должно быть elementForID: . Как отмечалось выше с тремя волшебными словами, именование в ObjC очень важно для написания стабильного кода

В качестве дополнительного примечания, в большинстве случаев традиционно используется id is, а не NSObject* . Они означают немного разные вещи, но обычно id это правильно.

Ответ №2:

Вам никогда не нужно выполнять какие-либо действия, связанные с управлением памятью nil . Итак, нет, вы не должны отправлять autorelease в nil .

Вам также не нужно отправлять autorelease в element объект, который вы возвращаете из вашего elements массива. Возвращаемый вами объект останется в памяти в силу того, что elements сам его сохранил. Если вызывающий метод хотел бы retain вернуть возвращаемое вами значение, он может. Но если этот вызывающий метод использует возвращаемое значение только в пределах своей собственной области видимости, для него безопасно делать это, не сохраняя его.