2014-09-08 6 views
5

Qualcuno sa perché ottengo BAD_ACCESS nell'ottenere l'impostazione & dei miei iVars con il seguente codice?Come utilizzare object_getIvar e object_setIvar di ogg-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

Il primo problema è che dovresti passare 'self' come primo argomento a' object_setIvar' e 'object_getIvar', ma continua a bloccarsi/esibire un comportamento strano dopo di ciò. Sospetto un insetto. –

risposta

1

si ottiene un cattivo accesso perché le classi Swift non hanno più Ivars tradizionali (cercare di afferrare una classe Swift il layout iVar e vedere di persona). Ma le classi Swift sono anche oggetti Objective-C per il runtime, e non sembrano esserci percorsi che escludano le classi Swift in esso.

Ciò che accade è che il runtime ti consegna un iVar fasullo che pensa veramente punti a un offset corretto nella definizione della classe (probabilmente 0 o giù di lì perché non esiste). Quando si tenta di ottenere detto iVar, il runtime letteralmente derefs you some of the object's bytes and tries to wrap it back up in an Objective-C pointer. Spesso questi dati hanno il bit codificato impostato involontariamente, e così spesso mappano a classi taggate (nei miei test ero in grado di recuperare un puntatore taggato per quello che il runtime pensava fosse NSMutableData).

Per farla breve: non puoi più farlo.

+0

Basta leggere questo e ha molto senso, spiegando perché il mio framework DI ha problemi con l'impostazione di ivars nelle classi veloci. La domanda che ho è questa. Se voglio impostare una var interna in una classe veloce. Come posso farlo? In Objective-C posso dichiarare e impostare una variabile interna che aiuta a mantenere pulite le interfacce. Devo ora esporre tutto come proprietà? Questo farebbe schifo. :-( – drekka