2009-05-19 10 views
1

Ich arbeite an einer Unterklasse von UIImageView und eines der Dinge, die ich benötige ist, wenn das Objekt mit der initWithImage initialisiert wird: Nachricht eine 'Kopie' erstellt wird.UIImageView Unterklasse das Bild duplizieren

Ich muss etwas verwirrend sein, weil ich nicht sehen kann, was hier nicht funktioniert ..

- (id)initWithImage:(UIImage *)image { 
[image retain]; 
if (self = [super initWithImage:image]) { 

    if (!maskImage) { 
     maskImage = [UIImage imageWithCGImage:[image CGImage]]; 
     if (maskImage != nil) { 
      NSLog(@"Made mask image"); 
     } else { 
      NSLog(@"Failed"); 
     } 
     //maskImage = [UIImage imageNamed:@"image.png"]; 
    } 
} 

[image release]; 
return self; 
} 

Es gibt keine Fehler, wenn ich das bauen und die MaskImage erscheint erstellt werden (i nicht bekommen, die Fehlermeldung). Wenn ich jedoch die Zeile, die von einem PNG zuweist, auskommentiere, funktioniert es.

Was fehlt mir?

Danke!

+0

Es ist nicht klar von dieser Frage, welches Problem Sie stoßen. Was meinst du mit "nicht arbeiten?" –

+0

OK Entschuldigung, ich habe Probleme beim Debuggen des Problems. Ich habe eine uiimage Kategorie, die Pixelwerte im Maskenbild ändert. Dies funktioniert mit der auskommentierten maskImage-Zeile, aber nicht mit dem maskImage = [UIImage imageWithCGImage: [image CGImage]]; Ich bin der Meinung, dass die Kategorie dieses Problem tatsächlich verursacht, da der Absturz, den ich bekomme, mit schlechtem Speicherzugriff zusammenhängt. –

Antwort

0

Versuchen Sie dies. Sollte arbeiten.

- (id)initWithImage:(NSString *)image { 
if (self = [super initWithImage:image]) { 

     if (!maskImage) { 
       img = [UIImage imageNamed:image]; 
       maskImage = CGImageRetain(img.CGImage); 
       if (maskImage != nil) { 
         NSLog(@"Made mask image"); 
       } else { 
         NSLog(@"Failed"); 
       } 
     } 
} 

return self; 
} 
  1. Änderungen
    • Pass statt Bild
    • keine Notwendigkeit NSString behalten/release Bild
    • img definieren müssen, MaskImage in .h
    • MaskImage in .h sollte have Retain-Eigenschaft in @property (z. B. @property (nichtatomare, behalten))
+0

Nur eine pingelige Notiz, aber Sie könnten in Betracht ziehen, die - (id) initWithImage: -Methode zu etwas in der Art von initWithImageNamed zu benennen: Die Art, wie es geschrieben wird, führt mich zu der Annahme, dass die Methode einen UIImage als Parameter nehmen würde , kein NSString mit dem Namen der Bilddatei. –

+0

Ja, on the fly Copy/Paste Code aus seinem Beispiel, würde aber Sinn machen. – Jordan

0

Zunächst sollten Sie MaskImage auf Null gesetzt, um sicherzustellen, dass es nicht Müll:

self.maskImage=nil; 

Das Ihre Linie vermasseln kann (wenn nicht jetzt, dann später):

if(!imaskImage) 

Um eine Kopie zu erstellen, implementieren Sie einfach NSCopying in einer UIImage-Unterklasse. Es ist einfach zu machen. Dann können Sie Folgendes eingeben:

maskImage = [image copy]; 

Alternativ können Sie das Bild auf Daten, Archiv konvertieren, dann unarchive, dann konvertieren zurück zu einem UIImage. Dies gibt Ihnen eine vollständige Kopie des Bildes. Es ist ein wenig komplexer, aber es ist dieselbe Methode, um tiefe Kopien eines Objektgraphen zu erstellen.

1

sollten Sie Bild retain erstellt, in Beispiel wie folgt aus:

- (id)initWithImage:(UIImage *)image { 
    if (self = [super initWithImage:image]) { 
     if (!maskImage) { 
       maskImage = [[UIImage imageWithCGImage:[image CGImage]] retain]; 
       if (maskImage != nil) {     
         NSLog(@"Made mask image"); 
       } else { 
         NSLog(@"Failed"); 
       } 
     } 
    } 
    return self; 
} 
Verwandte Themen