24

Gibt es eine Methode, die alle Schlüssel für ein Objekt zurückgibt, das dem NSKeyValueCoding-Protokoll entspricht?Wie finde ich alle Eigenschaftenschlüssel eines KVC-kompatiblen Objective-C-Objekts?

Etwas in Richtung [object getPropertyKeys], das ein NSArray von NSString-Objekten zurückgeben würde. Es würde für jedes KVC-konforme Objekt funktionieren. Gibt es eine solche Methode? Ich habe noch nichts gefunden, wenn ich die Apple-Dokumente durchsucht habe.

Danke, G.

Antwort

33
#import "objc/runtime.h" 

unsigned int outCount, i; 

objc_property_t *properties = class_copyPropertyList([self class], &outCount); 
for(i = 0; i < outCount; i++) { 
    objc_property_t property = properties[i]; 
    const char *propName = property_getName(property); 
    if(propName) { 
      const char *propType = getPropertyType(property); 
      NSString *propertyName = [NSString stringWithUTF8String:propName]; 
      NSString *propertyType = [NSString stringWithUTF8String:propType]; 
    } 
} 
free(properties); 
+0

Warum hat jemand das geändert? Ich bin interessiert zu wissen, was sie damit falsch finden. –

+0

Weil es eine falsche Antwort gab. Vor der Bearbeitung)) – oxigen

+1

Ja. Ich habe meinen Downmod zurückgezogen. BTW, stringWithCString: ist veraltet - benutze stringWithUTF8String: oder stringWithCString: encoding: stattdessen. –

3

Verwendung class_getPropertyList. Das wird Ihnen alle @properties des Objekts mitteilen.

Es wird nicht unbedingt jede KVC-konforme Eigenschaft aufgelistet, da jede Methode, die keine Argumente akzeptiert und einen Wert zurückgibt, ein gültiger KVC-kompatibler Getter ist. Es gibt keine 100% -zuverlässige Möglichkeit für die Laufzeit zu wissen, welche sich als Eigenschaften verhalten (z. B. -[NSString length]) und welche sich als Befehle verhalten (z. B. -[NSFileHandle readDataToEndOfFile]).

Sie sollten Ihre KVC-kompatiblen Eigenschaften sowieso als @properties deklarieren, daher sollte dies kein allzu großes Problem darstellen.

1

Es gibt keine solche Methode, da das KVO-System keine Objekte/Klassen benötigt, um sich bei ihm zu registrieren, für welche Eigenschaften sie KVO unterstützen. Jeder Schlüssel könnte möglicherweise KVO unterstützen, der einzige Weg, um zu wissen, ist aus der Dokumentation des Autors.

Und natürlich gibt es keine Garantie, dass ein @property KVO unterstützt; Es ist durchaus möglich, eine Eigenschaft zu schreiben, die nicht (und manchmal notwendig) sein kann. Also, eine Liste der s einer Klasse zu bekommen und dann anzunehmen, dass sie KVO-konform sind, wäre meiner Meinung nach eine gefährliche Wahl.

+0

Sie haben vielleicht einen Punkt, aber dies ist unglaublich nützlich für CoreData NSManagedObject abgeleitete Klassen. –

+0

OK, aber im speziellen Fall von Core Data, 'NSEntityDescription' macht wahrscheinlich das aus, was Sie interessieren –

+0

Sie haben absolut Recht, NSEntityDescription ist wahrscheinlich besser zu verwenden. –

0

Umwelt: Xcode7.2, iOS9.2

I-Code-Snippet verwenden unter Eigenschaftsnamen einer bestimmten Klasse zu erhalten, es funktioniert gut:

Import „objc/Laufzeit. h "

unsigned int outCount, i; 

objc_property_t *properties = class_copyPropertyList([SNBankBean class], &outCount); 
for(i = 0; i < outCount; i++) { 
    objc_property_t property = properties[i]; 
    const char *propName = property_getName(property); 
    if(propName) { 
     NSString *propertyName = [NSString stringWithUTF8String:propName]; 
     NSLog(@"the property name is %@",propertyName); 
     if ([propertyName isEqualToString:bank_name]) { 
      self.isBankExisted=YES; 
     } 
    } 
} 
free(properties); 
Verwandte Themen