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.

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top