Это сработало для меня на iPad, когда я слушаю MPMoviePlayerWillExitFullscreenNotification
.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(doneButtonClick:)
name:MPMoviePlayerWillExitFullscreenNotification
object:nil];
И метод выбора:
-(void)doneButtonClick:(NSNotification*)aNotification{
NSNumber *reason = [notification.userInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
if ([reason intValue] == MPMovieFinishReasonUserExited) {
// Your done button action here
}
}
Ваша теория верна. Управление памятью COM основано на подсчете ссылок. Метод Release
интерфейса IUnknown
уменьшит счетчик ссылок и вернет его. Эта функция не будет освобождать ссылки . Он не знает, у кого есть ссылка. Он просто уменьшает счетчик ссылок до тех пор, пока не достигнет нуля, а затем объект будет уничтожен. Это'
Release () вернет текущий счетчик ссылок на объект. Но этого делать не следует:
while( pointer->Release() > 0 );
Это обнулит счетчик ссылок и уничтожит объект.
В COM простое правило большого пальца - каждый AddRef () должно быть соответствующее Release () (только один).
Обычно реализация Release () будет выглядеть так:
int nCount = InterlockedDecrement(&this->m_cRef); //Decrement the ref count
if (nCount == 0)
{
delete this;
}
return nCount;
В дополнение к тому, что сказал Мердад, возвращаемое значение Release предназначено только для целей отладки. Производственный код должен просто игнорировать его.
Зацикливание, пока Release () не вернет 0, определенно является ошибкой - вы никогда не должны выпускать ссылки, которыми вы не владеете.