[英]How to solve this memory leak (iPhone)?
如何在沒有EXC_BAB_ACCESS的情況下釋放此變量?
//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;
看起來問題不在於UIImage,而在於NSData。 在Cocoa中,任何copy(或mutableCopy)方法都將返回保留計數為+1的對象,這意味着您擁有該對象,因此有責任釋放該對象。
在您的代碼中,您正在對myg.imageData調用-copy,但從不釋放它。 這是內存泄漏的經典示例。 這是我要修復的方法,還有一點點更改語法:
伊娃:
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];
您無需將-copy
發送到NSData對象。 UIImage
不會保留對周圍數據的引用,它只是讀取數據並生成圖像。 發送不帶-release
-copy
導致內存泄漏。
但是,這不能解釋EXC_BAD_ACCESS
。 發生了其他事情,而不是您發布的代碼。
您的代碼中有兩個問題。 如其他貢獻者所示復制imageData
,並在不保留對象的情況下分配給Moins1
字段。
對Moins1的Moins1
直接訪問該字段,因此您需要自己保留。 如果您不保留它並在下一行中釋放它,那么對該字段的任何子序列訪問都將導致保護錯誤。
您可以使用該屬性進行分配:
UIImage *ImageAvatar =
[[UIImage alloc] initWithData:[[myg.imageData copy] autorelease]];
self.Moins1 = ImageAvatar;
[ImageAvatar release];
或者,您也可以只一行完成:
self.Moins1 = [UIImage imageWithData:[[myg.imageData copy] autorelease]];
-(void )dealloc
{
if(self.Moins1!=nil)
{
self.Moins1 = nil;
}
}
看看當你給與對象一個retain屬性時,它的計數已經是1,而當你分配它的對象時,它的計數變成了2,所以當調用dealloc時,它將檢查它的nil是否為nil,如果不是nil則使其為nil。變量的保留計數為0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.