2014-06-13 3 views
0

J'ai une classe personnalisée nommée MyImage héritée de UIImage. Maintenant, j'ai un objet UIImage, est-il possible de le convertir en un objet MyImage?Objective-c convertir une classe parente à sa classe dérivée


Mise à jour

Désolé d'être claire.

Je ne peux pas utiliser une catégorie car j'ai besoin d'ajouter de nouvelles propriétés à ma classe.

Ce que je veux accomplir est de simplement laisser mon objet MyImage pointer vers l'objet UIImage d'origine.


Mise à jour 2

J'ai essayé quelque chose comme ceci:

- (MyImage*)initWithUIImage:(UIImage *)image { 
    if (self = [super init]) { 
     self = image; 
    } 
    return self; 
} 

Obvious il ne fonctionne pas.

En outre, étant donné que UIImage ne dispose pas d'une méthode nommée 'initWithImage: (UIImage *)', je ne peux pas écrire quelque chose comme

myImage = [[MyImage alloc] initWithImage:uiImage]; 

J'ai aussi essayé

self = [image copy] 

Mais la valeur de retour est encore un objet UIImage, pas un objet MyImage.


Mise à jour 3

En MonImage, je dois ajouter 3 propriétés: url, largeur et hauteur. Depuis que j'écris une application de messagerie instantanée, et quand je reçois un nouveau message d'image, je n'ai que son URL, sa largeur et sa hauteur. Puis j'attribue ceux-ci à un objet MyImage, et télécharge l'image en arrière-plan.

Maintenant donné un UIImage original A, je veux créer un nouvel objet MyImage B, qui pointe vers la même image que A, mais avec ces nouvelles propriétés non assignées. Ensuite, j'Affectez manuellement l'URL, la largeur et la hauteur B.

à @rmaddy, pourriez-vous me dire comment écrire la méthode

[[MyImage alloc] initWithImage:(UIImage*)] 

?

Une façon que je peux trouver est d'abord convertir l'objet UIImage à NSData, puis utilisez

[MyImage imageWithData:] 

Y at-il une meilleure façon?

+0

Vous pouvez écrire quelque chose comme 'myImage = [[MyImage alloc] initWithImage: uiImage];'. Comme indiqué dans ma réponse, cela nécessite d'ajouter la méthode 'initWithImage:' à votre classe 'MyImage'. – rmaddy

+0

Votre objet est soit un 'UIImage' ou un' MyImage'. Cela ne peut pas être les deux; cela violerait la loi de non-contradiction. Peut-être que cela vous aiderait si vous expliquiez pourquoi vous voulez sous-classer 'UIImage'. Par exemple, si vous ajoutez simplement des méthodes (quelque chose comme 'downloadWithURL:' est quelque peu commun), vous n'avez qu'à le faire, et vous pouvez alors utiliser 'MyImage' dans n'importe quelle classe qui nécessite un' UIImage', car 'MyImage' est une sorte de' UIImage'. –

+0

Publiez plus de détails sur votre classe 'MyImage'. Sans aucun détail, il est difficile d'offrir une réponse concrète. – rmaddy

Répondre

0

Je ne recommande pas forcément cela comme solution, mais il y a effectivement un moyen de faire exactement ce que vous cherchez. Il s'appelle ISA Swizzling. Pensez-y comme méthode swizzling mais pour Classes au lieu de méthodes.

Jetez un oeil à l'Objective-C object_setClass[link]

de l'exécution

Je ne vais pas entrer dans ce (il y a de meilleures ressources là-bas), mais cela est essentiellement comment fonctionne KVO.Quoi qu'il en soit, il serait utile que vous décriviez mieux la fonctionnalité de votre sous-classe UIImage, afin que nous puissions vous aider à expliquer pourquoi un initialiseur personnalisé comme décrit par rmaddy est probablement la meilleure solution.

+1

Cela ne fonctionnera pas si 'MyImage' requiert plus de mémoire que 'UIImage'. –

+0

Oui, beaucoup de raisons pour lesquelles vous ne devriez pas utiliser cela. Mais voulait le fournir comme une alternative éducative. @downvoter, c'est une réponse légitime à la question posée, pourquoi la downvote? –

+0

Je n'ai pas fait de downvote, et mon commentaire était destiné à développer votre réponse, pas à la critiquer. –

0

Votre classe MyImage est une sous-classe de UIImage, donc si vous créez une nouvelle instance dont vous avez besoin pour initialiser correctement la superclasse aussi bien. UIImage ne fournit pas une méthode pour le faire à partir d'une autre instance UIImage, mais vous pouvez utiliser un CGImage, et vous pouvez en obtenir un de l'image existante. Donc, faites ceci:

- (MyImage*)initWithUIImage:(UIImage *)image { 
    if (self = [super initWithCGImage:image.CGImage]) { 
     // put any necessary MyImage-specific stuff here 
    } 
    return self; 
} 
Questions connexes