Должен ли я отправить retain или autorelease перед возвратом объектов? - PullRequest
6 голосов
/ 15 ноября 2009

Я думал, что здесь все правильно, но я получил несколько предупреждений от Build and Analyze, так что теперь я не уверен в этом. Я предполагаю (а), что объект, который я получаю от функции (dateFromComponents: в этом случае), уже установлен для автоматического выпуска, и (б) то, что я возвращаю из функции, должен быть установлен для автоматического выпуска. Поэтому мне не нужно отправлять авто-релиз или сохранять результат dateFromComponents: прежде чем я верну его вызывающей стороне. Это верно?

В качестве примечания, если я переименую свою функцию из newTimeFromDate: в gnuTimeFromDate, анализатор не выдаст никаких предупреждений об этой функции. Это соглашение, что все "новые *" методы возвращают сохраненный, а не автоматически выпущенный объект?

В Руководстве по программированию управления памятью для какао говорится, что «полученный объект обычно гарантированно остается действительным в том методе, в котором он был получен» и что «Этот метод также может безопасно вернуть объект своему вызывающему. " Что заставляет меня верить, что мой код верен.

Однако в Управление памятью в какао говорится: «Предположим, что объекты, полученные любым другим методом, имеют счет сохранения 1 и находятся в пуле автоматического выпуска. Если вы хотите оставить его вне текущей области» казни, тогда вы должны сохранить ее. Что заставляет меня думать, что мне нужно сделать сохранение перед возвратом объекта NSDate.

Я разрабатываю с Xcode 3.2.1 на 10.6.2 для iPhone SDK 3.1.2.

снимок экрана сборки / анализа вывода http://nextsprinter.mggm.net/Screen%20shot%202009-11-15%20at%2008.33.00.png

Вот код на случай, если у вас возникли проблемы с чтением снимка экрана:

//============================================================================
// Given a date/time, returns NSDate for the specified time on that same day
//============================================================================
+(NSDate*) newTimeFromDate:(NSDate*)fromDate 
       Hour:(NSInteger)hour 
     Minute:(NSInteger)min 
     Second:(NSInteger)sec
{
 NSCalendar* curCalendar = [NSCalendar currentCalendar];
 const unsigned units    = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
 NSDateComponents* comps = [curCalendar components:units fromDate:fromDate];
 [comps setHour:   hour];
 [comps setMinute: min];
 [comps setSecond: sec];

 return [curCalendar dateFromComponents:comps];
}

1 Ответ

8 голосов
/ 15 ноября 2009

Вы почти правы. Единственная проблема, на которую правильно указывает clang, заключается в том, что ваш метод обещает сохранить количество +1 объекта (для его имени, содержащего «new»), но вы возвращаете объект с автоматическим освобождением.

У вас есть два варианта: удалить «новый» из имени метода или сохранить возвращенный объект. Гораздо больше какао для возврата автоматически выпущенного объекта (как вы делаете) и присвоения имени методу timeFromDate:.

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