Was ist "super" in Objective-C? (Selbst! = Super)?

8

Ich habe die folgende Frage gelesen und die Geschichte SEEMS einfach:

Was genau ist Super in Objective-C?

Noch ...

%Vor%

Das gibt "self = 0xa83dc50, super = 0xbfffe8d0" aus. Die Adressen sind nicht die gleichen ???!?!?

Diese zweite Adresse scheint wie ein "besonderer Wert" oder so. Was bedeutet das?

Danke an bbum für den Hinweis, dass dieser Wert die Stack-Adresse einer speziellen Struktur ist, die der Compiler verwendet, um das "super" -Verhalten zu implementieren.

Ich kann [super init] anrufen und der Anruf scheint zu funktionieren, oder zumindest explodiert nichts ... nicht sofort. Aufruf von [((id) 0xbfffe8d0) init] schlägt mit EXC_BAD_ACCESS schwer.

Dann gibt es den wirklich seltsamen Teil ..... Ich habe ein Stück Code, der ohne ersichtlichen Grund eine Ausnahme "NSGenericException: Sammlung wurde mutiert, während aufgezählt". Innerhalb eines DIFFERENT-Objekts (im Grunde ein Wrapper mit einem Zeiger auf den NSEnumerator) bewirkt das Auskommentieren des Aufrufs von "[super init]", dass die Ausnahme nicht auftritt. Wenn ich könnte, würde ich eine $$$ Belohnung für eine Antwort auf diesen Gedankenbändiger ausgeben.

"id sups = (id) 0xbfffe8d0" ... was auch zu "collection is modified" führt. ... WTF? Ok, ich schreibe eine zweite Frage für diese Bizzariotalität ...


Ich kam ursprünglich mit einem dieser "bizarren symtoms" Bugs hierher, die sich als völlig unzusammenhängend erwiesen (typisch für solche Dinge): Hat das Casting einer Adresse (id) Nebenwirkungen? Ist Adresse 0xbfffe8d0 speziell? (behoben: Problem mit _NSCallStackArray)

Der Inhalt oberhalb der Zeile ist jedoch weiterhin gültig und die Antwort immer noch ausgezeichnet. Lesen Sie es, wenn Sie ObjC nur ein wenig tiefer verstehen wollen.

    
Dave Dopson 01.04.2012, 02:54
quelle

1 Antwort

15

Sie machen sich mit dem Mann hinter dem Vorhang herum und er bestraft Sie dafür ...:)

super ist ein bisschen Compilermagie, wirklich. Wenn Sie [super doSomething] sagen, gibt der Compiler einen Aufruf an objc_msgSendSuper() statt an objc_msgSend() aus. Die meiste Zeit - es gibt einige Sonderfälle.

Im Allgemeinen sollten Sie super als nur als Ziel für Methodenaufrufe behandeln . Es sollte niemals irgendwo gespeichert werden und sollte niemals als , sondern betrachtet werden, die den Ausdruck für das Messaging zum Ziel haben.

Tatsächlich sollten Verwendungen von super , die Speicher enthalten, wahrscheinlich vom Compiler markiert werden.

In Bezug auf Ihren Bug klingt das sehr ähnlich, als ob entweder eine Beschädigung des Speichers, eine Überfreigabe und / oder Nebenläufigkeit vor sich gehen. Sie müssen mehr Code bereitstellen, der sich auf die Aufzählung und anderen relevanten Code bezieht, um weitere Schlussfolgerungen zu ziehen.

    
bbum 01.04.2012, 03:18
quelle

Tags und Links