NSObject personnalisé par ios

Si j'ai un NSObject personnalisé appelé Human qui a une sous-class appelée Male et j'ai un tableau appelé humains contenant des objects humains. Lorsque vous itérez sur le tableau humains, puis-je lancer l'object tel que:

for (Human *human in humans) { Male *male = (Male *)human; } 

ou est-il préférable de créer une méthode pour initWithMale tels que

 for (Human *human in humans) { Male *male = [[Male alloc] initWithMale:(Male *)human]; } 

Quelle serait la meilleure approche du sharepoint vue de la memory management ou cela n'aurait-il pas d'importance? Si c'est le dernier, comment puis-je gérer cela dans ma méthode initWithMale?

Merci

Cela dépend de ce que vous essayez d'accomplir. Si les objects du tableau humains sont des instances directes de Human, vous ne pouvez pas les transtyper dans une sous-class de Human car ils ne sont pas de ce type. Si ce scénario est correct et que vous essayez de convertir un humain en homme, vous devrez créer une méthode init dans la class Homme qui peut initier un nouvel object en utilisant un humain fourni:

 Male *male = [[Male alloc] initWithHuman: human]; 

Avec cette approche, votre méthode initWithHuman doit soit conserver la valeur transmise dans l'instance Human et referencer ses valeurs, soit copyr datatables nécessaires. L'approche ultérieure pourrait être ajoutée à la class Human elle-même et cela vous permettrait d'initier n'importe quelle sous-class en utilisant la méthode initWithHuman (en substance, en créant une fonction de copy de base).

Si le tableau des humains contient des sous-classs de Human, alors vous pouvez les transtyper dans l'instance correcte, cependant, vous devriez vérifier pour voir s'il s'agit de cette instance en premier. Voici un exemple:

 for (Human *human in humans) { if ([human isKindOfClass:[Male class]]) { Male *male = (Male *) human; } } 

Vous n'avez pas besoin de lancer un object de type id.