Автосвобождение объекта, возвращенного из NSMutableArray - PullRequest
1 голос
/ 13 апреля 2011

Когда метод возвращает объект, взятый из 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;
}

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

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

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

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

0 голосов
/ 13 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...