#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
вернуть возвращаемое вами значение, он может. Но если этот вызывающий метод использует возвращаемое значение только в пределах своей собственной области видимости, для него безопасно делать это, не сохраняя его.