Выделение и инициализация объекта в одной функции, отправка его в другую функцию и освобождение его там - PullRequest
0 голосов
/ 30 января 2012

У меня есть эта функция, которая выделяет и инициализирует объект:

    +(Item*)getItem:(NSString*)uid{
         Item *file = [[Item alloc]init];
         //do some stuff
         return file;
    }

и это вызов этой функции:

    Item *tmp = [LibraryScan getItem:itemid];
    //do some stuff
    [tmp release];

Теперь я хочу выпустить его после того, как получу, как я написал выше. Правильно ли я это сделал?

Ответы [ 3 ]

4 голосов
/ 30 января 2012

По моему мнению, вы должны автоматически высвобождать объект перед его возвратом, позволяя вызывающему абоненту решить, хочет ли он владеть им:

+(Item*)getItem:(NSString*)uid{
     Item *file = [[Item alloc]init];
     //do some stuff
     return [file autorelease];
}

Итак:

Item *tmp = [LibraryScan getItem:itemid];
//do some stuff
//[tmp release]; nothing to release
1 голос
/ 30 января 2012

Да, ваш код правильный. Но он также должен соответствовать соглашениям об именах target-c, в которых говорится, что методы, возвращающие неавторизованные объекты (то есть объект, за который ответственен вызывающий объект, должны содержать copy, alloc или new в имени метода.

Поэтому я бы изменил имя вашего метода на newItem, если вы действительно хотите вернуть из него неавторизованный объект.

0 голосов
/ 30 января 2012

Это не так, но это не стандартный способ.

Измените вашу реализацию следующим образом:

+(Item*)getItem:(NSString*)uid {
     Item *file = [[[Item alloc]init]autorelease];
     //do some stuff
     return file;
}

и:

Item *tmp = [[LibraryScan getItem:itemid]retain];
//do some stuff
[tmp release];

Это поможет вамотладить утечки памяти правильно.

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