簡體   English   中英

如何解決此內存泄漏(iPhone)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM