Что такое «супер» в Objective-C?(сам! = супер)? - PullRequest
8 голосов
/ 01 апреля 2012

Я прочитал вопрос ниже, и история SEEMS просто:

Что именно супер в Objective-C?

Все же ...

- (id) init
{
    NSLog(@"self=%p, super=%p", self, super);
}

Это выводит "self = 0xa83dc50, super = 0xbfffe8d0".Адреса НЕ ОДНОВРЕМЕННЫЕ ???!?!?

Этот второй адрес выглядит как «особое значение» или что-то в этом роде.Что это значит?

Спасибо bbum за то, что он указал, что это значение является адресом стека специальной структуры, используемой компилятором для реализации "супер" поведения.


Я могу позвонить [super init], и вызов, кажется, работает, или, по крайней мере, ничего не взрывается ... не сразу.Вызов [((id) 0xbfffe8d0) init] завершается неудачно с EXC_BAD_ACCESS.

Затем есть часть REALLY WEIRD ..... У меня есть фрагмент кода, который без объяснимой причины выдает "NSGenericException: коллекция была видоизменена при перечислении "исключение.Внутри РАЗЛИЧНОГО объекта (в основном это оболочка, которая имеет указатель на NSEnumerator), комментирование вызова «[super init]» приводит к тому, что исключение не происходит.Если бы я мог, я бы выложил награду в размере $$$ за ответ на этот тупой ум."... WTF?Итак, я выкладываю второй вопрос для этой странности ...


Первоначально я пришел сюда с одной из тех ошибок "странных симптомов", которые оказались совершенно не связаны (типично для таких вещей): Есть ли у приведения адреса (id) побочные эффекты ???Адрес 0xbfffe8d0 особенный?(исправлено: проблема была с _NSCallStackArray)

Тем не менее, содержимое над строкой остается в силе, и ответ по-прежнему отлично.Прочтите его, если хотите немного глубже понять ObjC.

1 Ответ

15 голосов
/ 01 апреля 2012

Вы балуетесь с человеком за занавесом, а он вас за это наказывает ...:)

super немного волшебства компилятора, правда. Когда вы говорите [super doSomething], компилятор отправит вызов objc_msgSendSuper() вместо objc_msgSend(). Большую часть времени - это особые случаи.

Как правило, super следует рассматривать как только как цель для вызовов методов . Оно никогда нигде не должно храниться и никогда не должно рассматриваться как , но , которое является целевым выражением для обмена сообщениями.

Фактически, использование super, которое связано с хранением, вероятно, должно быть помечено компилятором.

С точки зрения вашей ошибки, это звучит очень похоже на то, что происходит либо повреждение памяти, переиздание и / или параллелизм. Вам нужно будет предоставить больше кода, относящегося к перечислению, и другой соответствующий код, чтобы сделать вывод дальше.

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