2014-09-08 2 views
5

Weiß jemand, warum ich BAD_ACCESS auf & Einstellung meiner iVars mit dem folgenden Code bekomme?Wie benutze ich Object_getIvar und object_setIvar von objective-c-runtime in swift?

class myClass: NSObject { 
    var model = "Unspecified" 

    override init() { 
     super.init() 

     var key: NSString = "model" 
     var aClass : AnyClass? = self 
     var ivar: Ivar = class_getInstanceVariable(aClass, key.UTF8String) 

     // Set 
     object_setIvar(aClass, ivar, "R56") 

     // Get 
     var value: AnyObject = object_getIvar(aClass, ivar) 
    } 

} 

myClass() 
+2

Das erste Problem ist, dass Sie "self" als erstes Argument an "object_setIvar" und "object_getIvar" übergeben sollten, aber es stürzt immer noch ab und weist danach ein merkwürdiges Verhalten auf. Ich vermute einen Fehler. –

Antwort

1

Sie erhalten einen schlechten Zugang, weil Swift Klassen mehr nicht traditionelle IVARS haben (versuchen, eine Swift-Klasse iVar Layout zu packen und für sich selbst sehen). Aber Swift-Klassen sind auch Objective-C-Objekte für die Laufzeit, und es scheint keine Pfade zu geben, in denen Swift-Klassen nicht enthalten sind.

Was passiert, ist die Laufzeit hände Sie eine falsche iVar, dass es wirklich auf einen richtigen Offset in der Klassendefinition verweist (wahrscheinlich 0 oder so, weil es nicht existiert). Wenn Sie versuchen, sagte iVar, die Laufzeit buchstäblich derefs you some of the object's bytes and tries to wrap it back up in an Objective-C pointer. Oft wird in diesen Daten das Tag-Bit unabsichtlich gesetzt, und es werden so oft verschlagwortete Klassen zugeordnet (in meinen Tests bekam ich zuverlässig einen Tag-Zeiger zurück, den die Laufzeit für NSMutableData hielt).

Lange Rede kurzer Sinn: Sie können es nicht mehr tun.

+0

Lesen Sie dies einfach und es macht Sinn, zu erklären, warum mein DI-Framework Probleme mit der Einrichtung von Ivars in schnellen Klassen hat. Die Frage, die ich habe, ist diese. Wenn ich eine interne Var in einer schnellen Klasse setzen möchte. Wie kann ich es tun? In Objective-C kann ich eine interne Variable deklarieren und setzen, die hilft, Schnittstellen sauber zu halten. Muss ich jetzt alles als Eigenschaften entlarven? Das wäre scheiße. :-( – drekka