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