0

に次のメソッドがありますUIImageManipulation.m

+(UIImage *)scaleImage:(UIImage *)source toSize:(CGSize)size
{
    UIImage *scaledImage = nil;
    if (source != nil)
    {
        UIGraphicsBeginImageContext(size);
        [source drawInRect:CGRectMake(0, 0, size.width, size.height)];
        scaledImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    return scaledImage;
}

私は別のビューでそれを呼び出しています:

imageFromFile = [UIImageManipulator scaleImage:imageFromFile toSize:imageView.frame.size];

(imageView は以前に割り当てられた UIImageView です)

これは私のコードでうまく機能しています。画像のサイズを完全に変更し、エラーをスローしません。また、ビルド - >分析の下に何もポップアップしません。NSZombieEnabledしかし、別の問題をデバッグするためにオンにするEXC_BAD_ACCESSと、コードが壊れます。毎回。私はNSZombieEnabledオフにすることができます、コードはうまく動作します。私はそれをオンにし、ブーム。壊れた。呼び出しをコメントアウトすると、再び機能します。毎回、コンソールにエラーが表示されます: -[UIImage release]: message sent to deallocated instance 0x3b1d600. `NSZombieEnabled がオフになっている場合、このエラーは表示されません。

何か案は?

- 編集 -

わかりました、これは私を殺しています。私はできる限りどこでもブレークポイントをスタックしましたが、まだこのことを把握できません。scaleImageメソッドを呼び出すときの完全なコードは次のとおりです。

-(void)setupImageButton
{
    UIImage *imageFromFile;

    if (object.imageAttribute == nil) {
        imageFromFile = [UIImage imageNamed:@"no-image.png"];
    } else {
        imageFromFile = object.imageAttribute;
    }
    UIImage *scaledImage = [UIImageManipulator scaleImage:imageFromFile toSize:imageButton.frame.size];
    UIImage *roundedImage = [UIImageManipulator makeRoundCornerImage:scaledImage :10 :10 withBorder:YES];
    [imageButton setBackgroundImage:roundedImage forState:UIControlStateNormal];
}

他のUIImageManipulator方法 ( makeRoundCornerImage) がエラーを引き起こしているはずはありませんが、何かを見落としている場合に備えて、ファイル全体を github hereに投げました。

しかし、それはこの方法に関するものです。である必要があります。コメントアウトすると、うまくいきます。入れっぱなしだとエラー。NSZombieEnabledしかし、これまでオフにしてエラーをスローすることはありません。

4

2 に答える 2

3

NSZombieEnabled の目的は、割り当てが解除された後にオブジェクトに送信されるメッセージを検出することです。表示されているコンソール エラーは NSZombieEnabled でrelease、割り当てが解除された のインスタンスにメッセージが送信されていることを示していますUIImage。通常、このようなバグは、 への呼び出しが多すぎるreleaseか、 への呼び出しが不十分であることが原因ですretain

この場合、scaleImage:toSize:メソッドは autoreleased を返しますUIImage。NSZombieEnabled から得られるエラー メッセージは、返された後にこのオブジェクトを解放している可能性があることを示唆しています。これはあなたのバグを説明します。自動解放プールが枯渇すると、既に割り当てが解除されているオブジェクトを解放しようとします。

に渡しimageFromFilescaleImage:toSize:同じ変数を戻り値に再割り当てしています。このイディオム自体には何の問題もありませんが、このようなメモリ バグを回避するには、特別な注意が必要です。元のオブジェクトへの参照を上書きしているため、割り当ての前に自動解放されていることを確認するか、割り当て後に手動で解放できる別の参照を保存する必要があります。そうしないと、元のオブジェクトがリークします。

于 2010-06-07T21:06:22.437 に答える
0

makeRoundedCornerImageエラーは、からのメソッドで進行中のリリースが原因でしたUIImageManipulator。電源を入れないと拾われなかった理由はまだわかりませんが、それNSZombieEnabledが原因でした。

問題のある行は、元の質問で投稿した Gist の行 74 にあります。

于 2010-06-10T22:22:06.960 に答える