2016-06-24 14 views
0

Say zu schaffen, habe ich eine private Variable definiert isStarted in MyService Klasse & diese Klasse ist ein Singleton:Zugang private Variable ohne eine Eigenschaft

@implementation MyService { 
    BOOL isStarted; 
} 
... 
@end 

Meine Frage:

Ohne Schaffung Immobilien & Accessoren, gibt es eine Möglichkeit, auf diese private Variable von einer anderen Klasse zugreifen, nachdem ich eine Instanz dieser cla ss [MyService sharedInstance]. Wenn es einen Weg gibt, könntest du mir bitte zeigen, wie? Danke im Voraus.

(Bitte sprechen Sie nicht über „es wird nicht empfohlen, dies zu tun“, etc. Ich verstehe das. Ich bin einfach nur neugierig über die Möglichkeit, in Objective-c im allgemeinen privaten Bereich zuzugreifen.)

+0

Sie ohne * Erzeugen Sie bedeuten * ein Accessor @property, oder meinst du ohne Accessormethode überhaupt? – danh

+0

Siehe: http://jerrymarino.com/2014/01/31/objective-c-private-instance-variable-access.html – dan

+0

@danh, wäre es schön zu zeigen, wie auf private Variable zugreifen, ohne nur Eigentum zu verwenden & Zugriff ohne Verwendung von Eigenschaft und Accessoren. Ich bin neugierig auf beide Szenarien. –

Antwort

3

Hallo again =) Es gibt einen Weg - Sie können alle Klassenvariablen auf der Runtime bekommen und dort die Suche benötigt. Das ist immer noch schwer und nicht zu empfehlen. Warum möchten Sie keine Eigenschaften verwenden?

- (void*)getValueWithName:(const char*)varName forClass:(NSString*)className { 
     unsigned int varCount; 

     Class theClass = NSClassFromString(className); 
     Ivar *vars = class_copyIvarList(theClass, &varCount); 

     for (int i = 0; i < varCount; i++) { 
      Ivar var = vars[i]; 

      const char* name = ivar_getName(var); 
      if (strcmp(name, varName) == 0) { 
       ptrdiff_t offset = ivar_getOffset(var); 
       unsigned char* bytes = (unsigned char *)(__bridge void*)self; 
       free(vars); 
       return (bytes+offset); 
      } 

     } 



free(vars); 
     return NULL; 
    } 

und Casting-Wert:

NSInteger t = *(NSInteger*)[self getValueWithName:"p" forClass:@"ViewController"]; 
BOOL checkBool = *(BOOL*)[self getValueWithName:"boolean" forClass:@"ViewController"]; 
NSString *checkString = *((__unsafe_unretained NSString **)([self getValueWithName:"string" forClass:@"ViewController"])); 
+0

Ihre Frage zu mir macht wirklich keinen Unterschied als "Eigentum verwenden". Wie meine Frage sagt, bin ich nur neugierig auf einen Weg, dies zu ermöglichen, ohne Eigentum zu schaffen. Das ist es. Es gibt keinen Grund, warum ich kein Eigentum verwenden möchte. Ich hoffe, du verstehst, dass es nur meine Neugier ist. –

+0

Hoffe, diese Antwort hilft Ihnen) – Volodymyr

+0

Vielen Dank! Das ist die Antwort, die ich erwarte. Ich muss jetzt diesen Code studieren –

0

Ich bin nicht sicher, ob ein Singleton, wenn sein diese anders macht, aber hier ist eine ähnliche Frage.

Nach diesem Beitrag können Sie.

Accessing private variables from an external class - iOS

Es ist irgendwie alt, aber ich würde es ein Schuss.

Insbesondere diese Linie

[object valueForKey:@"variable_name"];  
+0

Nein, Singleton macht nichts anderes. Ich möchte dir nur schnell zeigen, dass ich eine Instanz dieser Klasse bekommen kann. So können Sie Singleton vergessen. –

+0

Aber um 'valueForKey' zu verwenden, muss ich eine Eigenschaft für die private Variable erstellen, über die ich nicht nachfrage. Ich meine, ich würde mit Laufzeitfehler enden "diese Klasse ist nicht Schlüssel-Kodierung-kompatibel für den Schlüssel" –

+0

Okay, ich war mir nicht sicher. Der Post hat nicht gesagt, dass Sie zuerst eine Immobilie machen mussten. Vielleicht kannst du es nicht ohne einen Accessor machen oder es zu einer Eigenschaft machen. Private Variablen sind so gestaltet, dass sie privat sind. Daher stelle ich mir vor, dass es keinen bequemen Weg gibt, auf sie zuzugreifen. – Lucas

Verwandte Themen