risposta

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

Perché qualcuno ha modificato questo valore? Sono interessato a sapere cosa pensano che sia sbagliato in questo. –

+0

Perché c'era una risposta sbagliata. Prima della modifica)) – oxigen

+1

Sì. Ho ritirato la mia caduta. BTW, stringWithCString: è deprecato: usa stringWithUTF8String: o stringWithCString: encoding: invece. –

3

Uso class_getPropertyList. Questo ti dirà tutto il @properties dell'oggetto.

Non elencherà necessariamente tutte le proprietà conformi a KVC, poiché qualsiasi metodo che non accetta argomenti e restituisce un valore è un getter valido per KVC. Non esiste un modo affidabile al 100% per il runtime di sapere quali si comportano come proprietà (ad es., -[NSString length]) e quali si comportano come comandi (ad es., -[NSFileHandle readDataToEndOfFile]).

Si dovrebbero dichiarare le proprie proprietà KVC come @properties in ogni caso, quindi questo non dovrebbe essere un problema troppo grande.

1

Non esiste un metodo come il sistema KVO non richiede oggetti/classi per registrarsi con quali proprietà supportano KVO. Qualsiasi chiave potrebbe potenzialmente supportare KVO, l'unico modo per sapere è dalla documentazione dell'autore.

E, naturalmente, non è garantito che un @property supporti KVO; è abbastanza possibile scrivere una proprietà che non lo fa (e potrebbe essere necessario a volte). Quindi, ottenere un elenco di @property di una classe e supponendo che siano conformi al KVO sarebbe una scelta pericolosa secondo me.

+0

Si potrebbe avere un punto, ma questo è incredibilmente utile per le classi derivate NSManagedObject di CoreData. –

+0

OK, ma nel caso specifico di Core Data, 'NSEntityDescription' probabilmente espone ciò che ti interessa –

+0

Hai assolutamente ragione, probabilmente è meglio usare NSEntityDescription. –

0

Ambiente: Xcode7.2, iOS9.2

io uso frammento di codice qui sotto per ottenere i nomi di proprietà di una classe specifica, funziona benissimo:

import "objc/runtime. 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);