24

Existe-t-il une méthode qui renvoie toutes les clés d'un objet conforme au protocole NSKeyValueCoding?Comment trouver toutes les clés de propriétés d'un objet Objective-C compatible KVC?

Quelque chose le long des lignes de [object getPropertyKeys] qui retournerait un NSArray d'objets NSString. Cela fonctionnerait pour n'importe quel objet compatible KVC. Une telle méthode existe-t-elle? Je n'ai rien trouvé dans la recherche des docs Apple jusqu'à présent.

Merci, G.

Répondre

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

Pourquoi quelqu'un a-t-il modulé cela? Je suis curieux de savoir ce qu'ils pensent qui ne va pas avec ça. –

+0

Parce qu'il y avait une mauvaise réponse. Avant d'éditer)) – oxigen

+1

Ouais. J'ai retiré mon downmod. BTW, stringWithCString: est deprecated-use stringWithUTF8String: ou stringWithCString: encoding: à la place. –

3

Utilisez class_getPropertyList. Cela vous dira tous les @properties de l'objet.

Il ne liste pas nécessairement toutes les propriétés compatibles KVC, car toute méthode qui ne prend aucun argument et renvoie une valeur est un getter compatible KVC valide. Il n'y a pas de moyen fiable à 100% pour l'exécution de savoir lesquels se comportent comme des propriétés (par exemple, -[NSString length]) et lesquels se comportent comme des commandes (par exemple, -[NSFileHandle readDataToEndOfFile]). De toute façon, vous devriez déclarer vos propriétés conformes au KVC comme étant @properties, cela ne devrait donc pas être trop gros.

1

Il n'existe pas de méthode telle que le système KVO ne nécessite pas d'objets/classes pour enregistrer avec quelles propriétés ils prennent en charge KVO. Toute clé peut potentiellement prendre en charge KVO, la seule façon de savoir est de la documentation de l'auteur.

Et bien sûr, il n'y a aucune garantie qu'un @property supportera KVO; il est tout à fait possible d'écrire une propriété qui ne l'est pas (et qui peut être nécessaire parfois). Donc, obtenir une liste des @property s d'une classe et ensuite supposer qu'ils sont conformes à la KVO serait un choix dangereux à mon avis.

+0

Vous pourriez avoir un point, mais ceci est incroyablement utile pour les classes dérivées NSManagedObject de CoreData. –

+0

OK, mais dans le cas spécifique des données de base, 'NSEntityDescription' expose probablement ce que vous aimez –

+0

Vous avez absolument raison, NSEntityDescription est probablement préférable d'utiliser. –

0

Environnement: Xcode7.2, iOS9.2

J'utilise l'extrait de code ci-dessous pour obtenir les noms de propriété d'une catégorie, il fonctionne très bien:

import « objc/exécution. 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); 
Questions connexes