Я думал, что здесь все правильно, но я получил несколько предупреждений от 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];
}