NSSound работает, но не инициализируется или не выделяется .. - PullRequest
1 голос
/ 14 ноября 2011

У меня есть простая программа, которая играет песню.Это в унаследованном методе awakeFromNib.Итак ..

-(void)awakeFromNib {
NSSound *song = [NSSound soundNamed:@"MyTune.mp3"];
[song play];
}

Мой вопрос, почему это работает.Почему я не должен это делать

NSSound *song = [[NSSound alloc]init];
song = [NSSound soundNamed:@"MyTune.mp3"];
[song play];
}

Кажется, он также работает со строками ... У меня установлена ​​переменная NSTextView, и я могу сделать следующее

-(void)awakeFromNib {
NSString *str = [NSString stringWithFormat:@"Hello there!"];
[myTextVariable insertText:str];
}

Почему я не должен был выделять и инициировать объекты .. Я так потерян .. Пожалуйста, помогите.

1 Ответ

1 голос
/ 14 ноября 2011

Многие из классов 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.

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