2012-01-16 2 views
0

私のアプリでは、UIImageの配列に移動し、この画像で物を作るループがあります。私が入れた関数の開始で非常にバックグラウンドスレッドでのループ作業 :私はUIImageを作成するループで[プールの解放];私のアプリをクラッシュする

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

と終わりで

[pool release]; 

ので、私はそれので、それを解放する必要があります私が解放をしないなら私に記憶の警告を与えなさい。

アプリがループを終了し、それは私にBAD_ACCESSエラーを与え、アプリをクラッシュ

[pool release]; 

に着きます。

編集


これはループ

 UIImage *tmp = [image rotate:UIImageOrientationRight]; 
     //do some stuff with this image 
     [tmp release]; 

これは回転方式でのメソッドです:私はあなたのクラッシュは、おそらく時に自動解放に関連していると思います

UIImage*   copy = nil; 
    CGRect    bnds = CGRectZero; 
    UIImage*   copy = nil; 
    CGContextRef  ctxt = nil; 
    CGImageRef   imag = self.CGImage; 
    CGRect    rect = CGRectZero; 
    CGAffineTransform tran = CGAffineTransformIdentity; 

    rect.size.width = CGImageGetWidth(imag); 
    rect.size.height = CGImageGetHeight(imag); 

    bnds = rect; 

    UIGraphicsBeginImageContext(bnds.size); 
    ctxt = UIGraphicsGetCurrentContext(); 

switch (orient) 
{ 
    case UIImageOrientationLeft: 
    case UIImageOrientationLeftMirrored: 
    case UIImageOrientationRight: 
    case UIImageOrientationRightMirrored: 
     CGContextScaleCTM(ctxt, -1.0, 1.0); 
     CGContextTranslateCTM(ctxt, -rect.size.height, 0.0); 
     break; 

    default: 
     CGContextScaleCTM(ctxt, 1.0, -1.0); 
     CGContextTranslateCTM(ctxt, 0.0, -rect.size.height); 
     break; 
} 

CGContextConcatCTM(ctxt, tran); 
CGContextDrawImage(UIGraphicsGetCurrentContext(), rect, imag); 

copy = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

if (imag) { 
    CFRelease(imag); 
} 

return copy; 
+3

UIImageを初期化する方法のコードを投稿できますか? –

+0

iコードが – MTA

+0

の投稿を編集します。プールが排水されると、プールが作成されてから自動リリースされたものがすべて解放されます。これにより2つの問題が発生する可能性があります。1)既にリリースされているものをリリースする - これにより、通常、その旨のエラーメッセージが表示されます。 2)あなたのUIオブジェクトの1つのように、実際にハングアップする必要があるものを解放する。これは通常、非常に役に立たないクラッシュメッセージをもたらす。特定の原因がかなり明白である場合もありますが、実際には把握するのが難しい場合もあります。 –

答えて

4

あなたはイメージを回転させた後、あなたのイメージを解放しています。

UIImage *tmp = [image rotate:UIImageOrientationRight]; 
    //do some stuff with this image 
    [tmp release]; // Here 

UIGraphicsGetImageFromCurrentImageContext()あなたは、あなたがそれを返す後に解放する呼び出す必要はありませんので、自動解放オブジェクトを返します。

最後に-releaseが流出し、以前に誤ってリリースされたオブジェクトに正しいリリースコールを送信するまで、NSAutoreleasePoolを解放するとクラッシュが発生します。

+0

私にそれを打つ。彼の質問は、過剰にリリースされたオブジェクトのように聞こえ、コードはそれを証明します。 –

0

プールは自動解放プールを解放するのではなく、UIImagesを解放します。

+0

これを修正する方法はありますか? – MTA

+0

ええ、マニュアルの[リリース](またはCFRelease())の呼び出しを外して、自動解放プールに処理させようとします。 – ACBurk

1

プールを作成してからもう一度リリースするまでに、作成したオブジェクトと所有していないオブジェクトを公開している可能性があります。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

NSString *s = [NSString stringWithFormat:@"%d", 2]; 
// Your string now has a retain count of one, but it's autoreleased. So when the pool 
// gets released it'll release the string 

[s release]; 
// You decrease the retain count to zero, so the object gets destroyed 
// s now points to a deallocated object 

[pool release]; 
// The pool gets destroyed, so it tries to send a release method to your string. However, 
// the string doesn't exist anymore so an error occurs. 
+0

しかし、私がオブジェクトを解放しない場合、私のアプリはメモリを取得します警告 – MTA

+0

この行の最初の行は正しいない。第1に、絶​​対保持カウントは役に立たない。彼らのことを考えないでください。次に、 'NSString'は静的に割り当てられたオブジェクトです。保持/解放はノーオペレーションです。 – bbum

+0

なぜ絶対保持カウントが役に立たないと思っていますか?静的に割り当てられたオブジェクトの問題を修正しました – v1Axvw

関連する問題