Memory management 按下按钮时会发生setImage上的EXC_BAD_访问,但异步调用setImage时不会发生

Memory management 按下按钮时会发生setImage上的EXC_BAD_访问,但异步调用setImage时不会发生,memory-management,ios4,uiimage,Memory Management,Ios4,Uiimage,我有一个按钮,当被选中时,我想用它来显示一个艺术品图像,但当没有被选中时,我想显示一个背景图像。该按钮称为albumArtworkView按钮,本质上是显示模式之间的切换。在选定状态下,新的艺术品会定期显示。为了使显示的图像成为清晰的图像,我发现必须将艺术品调整到albumArtworkView按钮的边界,如以下例程的行所示: -(void) handleChangesToArtwork { ... MPMediaItemArtwork *artwork = [currentIt

我有一个按钮,当被选中时,我想用它来显示一个艺术品图像,但当没有被选中时,我想显示一个背景图像。该按钮称为albumArtworkView按钮,本质上是显示模式之间的切换。在选定状态下,新的艺术品会定期显示。为了使显示的图像成为清晰的图像,我发现必须将艺术品调整到albumArtworkView按钮的边界,如以下例程的行所示:

-(void) handleChangesToArtwork {
    ...
    MPMediaItemArtwork *artwork = [currentItem valueForProperty: MPMediaItemPropertyArtwork];
    if (artwork) {
        artworkImage = [artwork imageWithSize: CGSizeMake (10, 10)]; // size for nav button
    }

    ...

    if (albumArtworkShowing) {
        artworkImage = [artwork imageWithSize: albumArtworkView.bounds.size]; // resize artwork for albumArtworkView button
        [albumArtworkView setImage:artworkImage forState: UIControlStateNormal];
    }
    ...
}
现在,artworkImage和albumArtworkView的定义如下:

@interface RootViewController : UIViewController <...> {
UIImage           *artworkImage;
IBOutlet UIButton *albumArtworkView;
}

-(IBAction) showAlbumArtwork:(id)sender;

@property (nonatomic, retain) UIImage           *artworkImage;
@property (nonatomic, retain) IBOutlet UIButton *albumArtworkView;
-(IBAction) showAlbumArtwork:(id)sender {
    if (albumArtworkShowing) {
        [self setAlbumArtworkShowing:FALSE];
        [albumArtworkView setImage:[UIImage imageNamed: @"backgroundImage.png"] forState: UIControlStateNormal];
    }
    else {
        [self setAlbumArtworkShowing:TRUE];
        if (artworkImage) {
            [albumArtworkView setImage:artworkImage forState: UIControlStateNormal];    // Now change the look of the albumArtworkView (speaker button) to the newly sized artworkImage
        }
        else {
            [albumArtworkView setImage:[UIImage imageNamed: @"no_artwork.png"] forState: UIControlStateNormal];
        }

    }

}
因此,如果我运行上述代码,就不会发生崩溃。然而,当我按下按钮时,艺术品的第一次显示是模糊的(因为从上面的逻辑可以看出,它使用的是10,10的cgsize)。但现在已选择albumArtworkView按钮且albumArtworkShowing标志现在为真,每次后续执行handleChangesToArtwork都会将艺术品调整到albumArtworkView按钮的边界,并且图像不再模糊

如果我在AlbumArtworksShowing标志为FALSE时修改上面的handleChangesToArtwork例程以包含一个else,如下所示:

-(void) handleChangesToArtwork {
    ...
    if (albumArtworkShowing) {
        ...
    }
    else {
        artworkImage = [artwork imageWithSize: albumArtworkView.bounds.size];
    }
}
那就是我得到一个EXC\u BAD\u访问权限的时候。选择按钮时,showAlbumArtwork方法中会发生此错误。具体地说,它发生在带有setImage的行上

我怀疑我一定有一些内存管理问题,但我不知道在哪里

有人能看出我的错误吗?

改变

artworkImage = [artwork imageWithSize: albumArtworkView.bounds.size];


这将确保使用artworkImage属性的setter,该setter保留实例。在当前代码中,您将自动删除的UIImage分配给artworkImage而不保留它,从而导致EXC_BAD_访问

太棒了!你能通过点击勾号使这个答案成为被接受的答案吗?(获取一些布朗尼点数,并向其他有相同问题的SO用户说明这是正确的解决方案)
self.artworkImage = [artwork imageWithSize: albumArtworkView.bounds.size];