2010-07-18 15 views
0

Apple déclare-t-il la méthode [CIImage initWithImage:(CIImage*)] que je ne connais pas? La seule méthode avec cette signature que je connais est [CISampler initWithImage:]. Mais quand j'ai essayé de fournir ma propre méthode, le compilateur m'avertit en disant que la méthode existe déjà. Contexte: J'essaie de créer une méthode pratique qui convertit une instance NSImage en CIImage. Ensuite, j'ai créé une méthode de catégorie [CIImage initWithImage:] qui prend dans une instance NSImage.Méthode cachée [CIImage initWithImage:]?

Voici la déclaration de la méthode de la catégorie:

@interface CIImage (QuartzCoreExtras) 
-(id) initWithImage:(NSImage*) img; 
@end 

J'ai essayé de l'utiliser dans une sous-classe NSImageView pour mettre en cache la version CoreImage de l'image:

-(void) setImage:(NSImage *)newImage { 
    [super setImage:newImage]; 
    [ciImage release]; 
    ciImage = [[CIImage alloc] initWithImage:newImage]; 
} 

Mais quand je compile la méthode ci-dessus , J'obtiens un avertissement disant que quelqu'un d'autre a déjà défini la méthode et prend un paramètre différent:

warning: incompatible Objective-C types 'struct NSImage *', expected 'struct CIImage *' when passing argument 1 of 'initWithImage:' from distinct Objective-C type 

De l'option « Aller à la définition » dans XCode, la seule autre mise en œuvre de la méthode (en plus de ma propre implémentation) est [CISampler initWithImage:(CIImage*]. Je suis vraiment intrigué par cette question - y a-t-il quelque chose que j'ai mal fait?

Juste pour l'amour de l'exhaustivité, voici le corps de la méthode pour [CIImage initWithImage:]:

@implementation CIImage (QuartzCoreExtras) 
-(id) initWithImage:(NSImage*) img { 
    NSData* tiffData = [img TIFFRepresentation]; 
    NSBitmapImageRep* bitmap = [NSBitmapImageRep imageRepWithData:tiffData]; 
    return [self initWithBitmapImageRep:bitmap];  
} 
@end 

Merci à l'avance.

Répondre

2

A une supposition, vous n'avez pas inclus l'en-tête qui définit votre catégorie dans votre fichier .m,

L'astuce ici est que [CIImage alloc] retourne une valeur de type « id ». En tant que tels, ils ne savent pas limiter la recherche uniquement à la classe CIImage, et parcourent toutes les classes, ce qui explique pourquoi ils trouvent la définition dans CISampler.

Je pense que si vous changez votre code à ceci:

ciImage = [ ((CImage*)[CIImage alloc]) initWithImage:newImage]; 

vous pouvez aller au-delà de l'avertissement, puisque le compilateur aura plus d'un indice sur la version de initWithImage: à utiliser.

Ayant triste, sa mauvaise forme pour faire ce que vous avez fait. Renommez votre méthode en initWithNSImage: - à long terme, il sera plus facile à supporter. (Apple devrait vraiment avoir nommé leur méthode initWithNSImage: mais ils semblent avoir généralement réservé le droit de retirer le "NS" de leurs méthodes, et puisque c'est leur framework, ils gagnent).

+0

Peu importe ce que Apple nomme leur méthode si le questionneur propose le même sélecteur, et vice versa - et, en fait, il pourrait très bien être caché '- [CIImage initWithImage:]' (ou ' initWithNSImage: ') méthode, c'est pourquoi c'est une bonne idée de marquer toutes les méthodes que vous ajoutez dans les catégories avec un préfixe ou un suffixe unique à votre application. –

+0

J'inclus le fichier d'en-tête de ma catégorie et je reçois toujours l'avertissement du compilateur. Finalement, j'ai abandonné et nommé ma méthode "initWithNSImage" à la place. – adib