2013-05-06 7 views
2

В чем разница между вызовом [super dealloc] и получением IMP из суперкласса и вызовом этого?Разница между вызовом [super dealloc] и вызовом реализации суперкласса '

Method deallocMethod = class_getInstanceMethod([self superclass], @selector(dealloc)); 
IMP superImp = method_getImplementation(deallocMethod); 
((void (*)(id, SEL))superImp)(self, _cmd); 

Я получаю два разных поведения в зависимости от того, что я использую. Я вижу это различное поведение в динамическом подклассе UIViewController.

Edit:

Выработать. Я не использую ARC.

Также разницу в поведении сложно описать, но я постараюсь изо всех сил. Кажется, что очистка, которую выполняет UIViewController, находится в dealloc, не выполняется. Если я назову только [super dealloc], я получаю сообщение, отправляемое на освобожденный экземпляр контроллера вида. Это происходит, когда он увеличивает хэш контроллеров представления для представлений (что-то внутреннее, что я не совсем понимаю) в статической функции UIViewController (+ [UIViewController setViewController: forView:]). Я предполагаю, что контроллеры представлений не удаляются из хэша в случае, когда я вызываю только [super dealloc].

+1

Если вы используете ARC, тогда все ставки отключены. –

+2

Каковы различия в поведении? Легче объяснить симптомы, когда мы знаем, что они собой представляют. –

+0

Я просто добавил больше описания разницы в поведении. Я не на 100% не понимаю, что именно. Я надеялся, что ответ здесь может дать мне подсказку, но я сделал все возможное, чтобы описать это. – drewag

ответ

1

Вы не звоните [super dealloc] в ARC. В противном случае оба они одинаковы.

0

Я получил здесь буквально часы поиска в Интернете и просматривал страницы книг, пытаясь назвать версию метода супер (но не зная имя метода во время компиляции).

Это все, все это очистило для меня. Я получал это право примерно на 90%, за исключением синтаксиса указателя функции.

((void (*)(id, SEL)) часть все, что мне недоставало.

Я делал эквивалент superImp (self, _cmd) и продолжал задаваться вопросом, как получилось, что он работает (отладчик показывал мне, что версия суперкласса функции выполнялась), но когда зеленая линия отладчика вернулась к исходной строке вызова Я получал EXC_BAD_ACCESS (code = 1, address = well...whatever)

Любопытный факт ... Я помню, как читал о указателях функций много-много-много лет назад, и когда я столкнулся с этой темой, синтаксис древага имел смысл ... однако я столкнулся со многими другими темами, описывающими выпускайте по принципу «захватите IMP и просто используйте его для вызова». Никто на других темах не упоминал ничего о том, как указать параметры и тип возврата.

Thank you, drewag.

Смежные вопросы