2011-09-15 11 views
0

可能性の重複:
How to release an object declared into a method and passed to another method?このコードで私が漏れるの理解を助ける:

はあなたが私はこのコードでリークを修正するのに役立つことができます:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    UIImage *payload = [[UIImage alloc] initWithData:self.activeDownload]; 
    UIImage *picture = [[UIImage alloc] init]; 
    if (payload.size.width != kAppIconHeight && payload.size.height != kAppIconHeight) 
    { 
     CGSize itemSize = CGSizeMake(kAppIconHeight, kAppIconHeight); 
     UIGraphicsBeginImageContext(itemSize); 
     CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height); 
     [payload drawInRect:imageRect]; 
     picture = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
    } 
    else 
    { 
     picture = payload; 
    } 

    self.activeDownload = nil; 
    [payload release]; 

    self.imageConnection = nil; 

    [delegate ThumbDidLoad:self.indexPathInTableView Image:[picture autorelease]]; 
} 

Thxをを助けるため、

Stephaあなたはelse声明の中で、あなたのifステートメントまたはpicture = payloadpicture = UIGraphicsGetImageFromCurrentImageContext()を設定すると、NE

+0

これは、[メソッドに宣言し、別のメソッドに渡されたオブジェクトを解放するためにどのように?]再投稿である(http://stackoverflow.com/questions/7431777/how-to-release-an -object-declaration-into-a-method-and-passed-to-another-method/7432269#7432269) – Sam

答えて

4

、あなたが最初の行にpictureに割り当てられた以前に割り当てられたUIImageへのポインタを失うされていますが、あなたはそれを解放することはありません。

pictureに新しいUIImageを割り当ててはいけません。後でこの変数に新しい値を割り当てますが、以前に割り当てられたものを使用して解放することはありません。

+0

しかし、「画像= UIGraphicsGetImageFromCurrentImageContext();」を実行しているとき2行目に宣言したピクチャインスタンスにUIImage * picture = [[UIImage alloc] init;;)を保存していません。 – Steve

+0

もちろんです。あなたが 'int x = 5'をやっていて、その後いくつかの行が' x = 12'のようなものです。もちろん、あなたの価値5は永遠に失われます。ここでは、 'picture'変数に既にメモリ内に存在するobjetを割り当てます。前に 'alloc + init'を使って割り当てた、以前は' picture'に格納していたオブジェクトは、明らかにまったく異なった(無駄で漏れた)ものです。 – AliSoftware

0
  1. UIImage *picture = [[UIImage alloc] init];picture = UIGraphicsGetImageFromCurrentImageContext(); あなたは、コードの先頭にpictureを初期化するべきではありません。 UIGraphicsGetImageFromCurrentImageContextは既に初期化されたUIImage(自動リリース済み)を返します。

  2. UIImage *payload = [[UIImage alloc] initWithData:self.activeDownload];,picture = payload;,[payload release];。 代わりに[payload autorelease]を使用する必要があります。そうしないと、画像を使用することなく画像が解放されます。

  3. [delegate ThumbDidLoad:self.indexPathInTableView Image:[picture autorelease]]; あなたは[picture autorelease]を削除し、ちょうどpictureを使用する必要があります。

    -(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
        UIImage *payload = [[UIImage alloc] initWithData:self.activeDownload]; 
        UIImage *picture; 
        if (payload.size.width != kAppIconHeight && payload.size.height != kAppIconHeight) 
        { 
         CGSize itemSize = CGSizeMake(kAppIconHeight, kAppIconHeight); 
         UIGraphicsBeginImageContext(itemSize); 
         CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height); 
         [payload drawInRect:imageRect]; 
         picture = UIGraphicsGetImageFromCurrentImageContext(); 
         UIGraphicsEndImageContext(); 
        } 
        else 
        { 
         picture = payload; 
        } 
        [payload autorelease]; 
        self.activeDownload = nil; 
    
        self.imageConnection = nil; 
    
        [delegate ThumbDidLoad:self.indexPathInTableView Image:picture]; 
    } 
    
関連する問題