Metodo [CIIMAGE INITIVEWIMAGE:]?
-
17-09-2020 - |
Domanda
è il metodo di dichiarazione Apple [CIImage initWithImage:(CIImage*)]
di cui non sono a conoscenza? L'unico metodo con quella firma di cui sono a conoscenza è [CISampler initWithImage:]
. Ma quando ho provato a fornire il mio metodo, il compilatore mi avverte dicendo che il metodo esiste già.
Sfondo: sto cercando di creare un metodo di convenienza che converte un'istanza NSImage
in CIImage
. Quindi ho creato un metodo di categoria [CIImage initWithImage:]
che assume un'istanza NSImage
.
Ecco la dichiarazione del metodo della categoria:
@interface CIImage (QuartzCoreExtras)
-(id) initWithImage:(NSImage*) img;
@end
.
Ho provato a usarlo in una sottoclasse NSImageView
per cache la versione di CoreImagrage dell'immagine:
-(void) setImage:(NSImage *)newImage {
[super setImage:newImage];
[ciImage release];
ciImage = [[CIImage alloc] initWithImage:newImage];
}
.
Ma quando compilo il metodo sopra, ottengo un avviso che dice che qualcun altro ha già definito il metodo e ci vuole un parametro diverso:
warning: incompatible Objective-C types 'struct NSImage *', expected 'struct CIImage *' when passing argument 1 of 'initWithImage:' from distinct Objective-C type
.
Dalla opzione "Vai alla definizione" in Xcode, l'unica altra implementazione del metodo (oltre alla mia stessa implementazione) è [CISampler initWithImage:(CIImage*]
. Sono davvero perplesso da questo problema - c'è qualcosa che ho sbagliato?
Solo per la completezza ', ecco il metodo corpo per [CIImage initWithImage:]
:
@implementation CIImage (QuartzCoreExtras)
-(id) initWithImage:(NSImage*) img {
NSData* tiffData = [img TIFFRepresentation];
NSBitmapImageRep* bitmap = [NSBitmapImageRep imageRepWithData:tiffData];
return [self initWithBitmapImageRep:bitmap];
}
@end
.
Grazie in anticipo.
Soluzione
Ai suoi ipotesi, non hai incluso l'intestazione che definisce la tua categoria nel tuo file .m,
Il trucco qui è che [CIIMAGE ALLOC] restituisce un valore di tipo 'ID'.Come tale, non sanno limitare la ricerca solo alla classe di ciimage, e invece guardare attraverso tutte le classi, motivo per cui trovano la definizione in cisampler.
Penso che se cambi il tuo codice in questo:
ciImage = [ ((CImage*)[CIImage alloc]) initWithImage:newImage];
.
È possibile superare l'avviso, dal momento che il compilatore avrà più indizio su quale versione di initwithimage: da utilizzare.
Avendo triste, la sua cattiva forma per fare ciò che hai fatto.Rinominare il tuo metodo per iniziarewithnsimage: - A lungo termine, sarà più facile da supportare.
(Apple dovrebbe davvero aver chiamato il loro metodo Initwithnsimage: ma sembrano aver generalmente riservato il diritto di rimuovere i "NS" dai loro metodi, e dal suo framework, vincono).