Многие из классов Apple имеют вспомогательные функции, объявленные на уровне классов, которые выполняют выделение и инициализацию внутри вспомогательной функции. Они возвращают готовый к использованию объект. Вы можете сказать, смотрите ли вы документ для метода, и он говорит что-то вроде «Возвращает экземпляр NSSound, связанный с данным именем.»
Следовательно, ваш первый пример - хороший код:
-(void)awakeFromNib {
NSSound *song = [NSSound soundNamed:@"MyTune.mp3"];
[song play];
}
Ваш второй пример приводит к утечке памяти, поскольку вы выделяете, а затем перезаписываете свой указатель новым объектом, возвращаемым [NSSound soundNamed:@"MyTune.mp3"]
:
-(void)awakeFromNib {
// Create an NSSound object in memory and store the address in song.
NSSound *song = [[NSSound alloc]init];
// If you don't want a memory leak this is your last chance to [song release]
// Create a NSSound object using a helper function and place its address
// in song, over writing the previous address.
song = [NSSound soundNamed:@"MyTune.mp3"];
// We now lost track of the first NSSound object and can't release it because
// we overwrote the address.
[song play];
}
Из документации вы можете видеть, что этот метод выполняет alloc
и init
внутри него и возвращает вам экземпляр:
soundNamed
Возвращает экземпляр NSSound, связанный с данным именем.
+ (id) soundNamed: (NSString *) soundName
Параметры
SoundName
Имя, которое идентифицирует звуковые данные.
Возвращаемое значение
Экземпляр NSSound, инициализированный звуковыми данными, идентифицированными soundName.