2009-07-31 90 views
0

如何在沒有EXC_BAB_ACCESS的情況下釋放此變量?如何解決這個內存泄漏(iPhone)?

//First line create memory leak 
UIImage *ImageAvatar = [[UIImage alloc] initWithData:[myg.imageData copy]]; 
Moins1 = ImageAvatar; 
//[ImageAvatar release]; if i release-> EXC_BAD_ACCESS 

Moins1是接口的會員專區聲明如下:

UIImage *Moins1; 
... 
@property (nonatomic, retain) UIImage   *Moins1; 
+0

除非你有很好的理由打破Obj-C約定,否則變量應該有一個小寫的第一個字母 - 'ImageAvatar'應該是'imageAvatar','Moins1'應該是'moins1'。 – 2010-03-14 05:37:25

回答

2

看起來問題不是UIImage的,而是NSData的。在Cocoa中,任何複製(或mutableCopy)方法都會返回一個帶有+1保留計數的對象,這意味着您擁有它並因此負責釋放它。

在你的代碼中,你正在調用-copy myg.imageData,但從來沒有釋放它。這是內存泄漏的典型例子。這裏是我會做什麼來解決它,再加上改變你的語法有點:

伊娃:

UIImage *Moins1; 
@property (nonatomic, retain) UIImage *Moins1; 

實現:

NSData * imageData = [myg.imageData copy]; 
UIImage * ImageAvatar = [[UIImage alloc] initWithData:imageData]; 
[imageData release]; 
[self setMoins1:ImageAvatar]; 
[ImageAvatar release]; 
0

你不應該需要發送-copy到NSData對象。 UIImage不保留對數據的引用,只是讀取它並生成圖像。發送-copy而沒有-release是內存泄漏。

但是,這並不能解釋EXC_BAD_ACCESS。還有其他事情正在發生,而不是您發佈的代碼。

0

你的代碼有兩個問題。如其他貢獻者所指示的imageData的複製,以及賦予Moins1字段而不保留該對象。

Moins1直接訪問該字段,所以你需要做你自己的保留。如果您不保留它並在下一行中釋放它,則對該字段的任何子序列訪問都會導致保護錯誤。

可以使用屬性賦值:

UIImage *ImageAvatar = 
    [[UIImage alloc] initWithData:[[myg.imageData copy] autorelease]]; 
self.Moins1 = ImageAvatar; 
[ImageAvatar release]; 

或者你也可以做它在同一行:

self.Moins1 = [UIImage imageWithData:[[myg.imageData copy] autorelease]]; 
0
-(void)dealloc 
    { 
    if(self.Moins1!=nil) 
    { 
     self.Moins1 = nil; 
    } 
    } 

看到,當你給和對象一個保留屬性的計數已經是1,當你分配它時,它的計數變成2,所以當dealloc被調用時,它將檢查它是否爲零,如果它不爲零,這樣它將使變量的保留計數爲0

+0

而不是隻發佈一段代碼,請*解釋*爲什麼這段代碼解決了問題。沒有解釋,這不是一個答案。 – 2012-10-10 09:11:44