Любой или оба этих метода могут применяться в зависимости от ситуации.
Значение функции this
внутри функции зависит от того, как была вызвана функция. Если вы вызываете функцию как свойство объекта следующим образом:
obj.key2();
//or
obj["key2"]();
Тогда this
будет этим объектом.
Но вы можете использовать .call()
или .apply()
для вызова функции и явно установить this
к некоторому другому объекту.
Рассмотрим также:
var obj = {
key1: "it",
key2: function(){return this.key1 + " works!"}
};
alert(obj.key2()); // alerts "it works!"
var func = obj.key2;
alert(func()); // alerts "undefined works!"
Я настраиваю func
для ссылки на ту же функцию, что и obj.key2
, но называя ее как func()
делает не значение this
- obj
.
Для получения дополнительной информации смотрите , что MDN должен сказать о this
.
Я написал фреймворк на C ++, который может помочь: http://github.com/sbooth/SFBAudioEngine
Он поддерживает несколько аудиоформатов, имеет довольно удобный API и поставляется с образцом Какао.
Если вас не интересуют сторонние фреймворки, вы, вероятно, будете использовать AudioQueue, чтобы позаботиться о воспроизведении. Для этого вы, вероятно, использовали бы AudioFile для декодирования MP3 и AudioQueue для воспроизведения. У Apple есть пример на http://developer.apple.com/mac/library/samplecode/AudioQueueTools/Introduction/Intro.html
Помимо NSSound
, вы можете рассмотреть QTMovieView
. Это звучит странно, но вы можете иметь скрытый QTMovieView
в своем окне и использовать его для воспроизведения MP3.
Добавлено: QTMovieView
устарел в ОС 10.9. Поэтому, если вам не нужна поддержка версий ОС до 10.7 (когда AVFoundation пришла на Mac), вам, вероятно, не следует использовать это.
Используйте NSSound .
Вы не указали, что вы подразумеваете под «множеством ограничений», поэтому я не знаю, почему это не сработает для вас. Обратите внимание, что по сравнению с Leopard у него намного меньше ограничений; теперь вы можете играть, например, на любом устройстве.