Odpowiedz

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

Dlaczego ktoś to zmodował? Jestem zainteresowany tym, co myślą, że jest z tym nie tak. –

+0

Ponieważ wystąpiła zła odpowiedź. Przed edycją)) – oxigen

+1

Tak. Wycofałem mój downmod. BTW, stringWithCString: jest przestarzałym-use stringWithUTF8String: or stringWithCString: encoding: zamiast. –

3

Zastosowanie class_getPropertyList. To powie ci wszystkie @properties obiektu.

Nie musi to oznaczać każdej właściwości zgodnej z KVC, ponieważ każda metoda, która nie przyjmuje argumentów i zwraca wartość, jest prawidłowym programem pobierającym KVC. Nie ma w 100% niezawodnego sposobu, aby środowisko wykonawcze wiedziało, które z nich zachowują się jak właściwości (np. -[NSString length]) i które zachowują się jak polecenia (np. -[NSFileHandle readDataToEndOfFile]).

W każdym razie powinieneś zadeklarować swoje właściwości zgodne z KVC jako @properties, więc nie powinno to być zbyt dużym problemem.

1

Nie ma takiej metody, ponieważ system KVO nie wymaga rejestrowania w obiektach/obiektach właściwości, dla których wspiera KVO. Każdy klucz może potencjalnie wspierać KVO, jedyny sposób, aby to wiedzieć, pochodzi z dokumentacji autora.

Oczywiście nie ma gwarancji, że @property będzie obsługiwać KVO; można napisać właściwość, która nie jest (i czasami może być konieczna). Zatem uzyskanie listy klasy klasy @property s, a następnie założenie, że są zgodne z KVO, byłoby moim zdaniem niebezpiecznym wyborem.

+0

Możliwe, że masz rację, ale jest to niezwykle użyteczne dla klas pochodnych CoreData NSManagedObject. –

+0

OK, ale w konkretnym przypadku Core Data, 'NSEntityDescription' prawdopodobnie ujawnia to, na czym ci zależy –

+0

Masz całkowitą rację, NSEntityDescription jest prawdopodobnie lepszy w użyciu. –

0

środowiska: Xcode7.2, iOS9.2

Używam fragment kodu poniżej, aby uzyskać nazwy własności określonej klasy, to działa dobrze:

import „objc/wykonania. 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);