2009-05-19 61 views
1

我正在處理UIImageView的一個子類,我需要的一件事是當對象使用initWithImage初始化時:創建'copy'消息。UIImageView子類複製圖像

我必須混淆的東西,因爲我看不到有什麼是不是在這裏工作..

- (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; 
} 

當我建立這個與maskimage確實出現了要創建有沒有錯誤(我不明白失敗消息)。但是,如果我取消註釋從png分配的行,它的工作。

我錯過了什麼?

謝謝!

+0

這不是來自這個問題你遇到什麼問題不清楚。 「不工作」是什麼意思? – 2009-05-19 20:21:23

+0

好的,很抱歉,我在調試問題時遇到了問題。 我有一個uiimage類別,用於更改蒙版圖像中的像素值。這可以使用註釋掉的maskImage行,但不使用maskImage = [UIImage imageWithCGImage:[image CGImage]]; 我很懷疑實際上導致這個問題的類別,因爲我得到的崩潰與內存訪問不良有關。 – 2009-05-19 20:35:24

回答

0

試試這個。應該管用。

- (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. 變化
    • 通的NSString,而不是像
    • 沒有必要保留/釋放圖像
    • 需要定義IMG,maskImage在.H
    • maskImage在.H應保留在@property中設置的屬性(例如 @property(nonatomic,retain))
0

首先,你應該設置maskImage爲零,以確保它是不是垃圾:

self.maskImage=nil; 

這可能(後來如果不是現在,那)搞砸了您的線路:

if(!imaskImage) 

然後,要製作副本,只需在UIImage子類中實現NSCopying。這很容易做到。然後你可以輸入:

maskImage = [image copy]; 

或者,你可以將圖像轉換爲數據,存檔,然後取消存檔,然後轉換回UIImage。這給你一個完整的圖像副本。它稍微複雜一點,但它與用於製作對象圖的深度副本的方法相同。

1

您應保留生成的圖像,例如,在這樣的:

- (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; 
}