2011-07-29 4 views
0

ボタンを選択すると、アートワークイメージを表示するために使用しますが、選択されていない場合は、 。このボタンはalbumArtworkViewボタンと呼ばれ、本質的に表示モードの切り替えです。選択状態では、新しいアートワークが定期的に表示されます。setImageのEXC_BAD_ACCESSは、ボタンを押したときに発生しますが、setImageの非同期呼び出しでは発生しません。

-(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:シャープ画像であると表示された画像のためのために、私は次のルーチンの行に示すようにアートワークがalbumArtworkViewボタンの境界にサイズ変更しなければならないことを発見しました

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

-(IBAction) showAlbumArtwork:(id)sender; 

@property (nonatomic, retain) UIImage   *artworkImage; 
@property (nonatomic, retain) IBOutlet UIButton *albumArtworkView; 

ボタン選択操作を処理するshowAlbumArtworkメソッドの定義に注目してください。このメソッドは次のように実装されています。

-(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フラグがTRUEになると、handleChangesToArtworkを実行するたびにアートワークがalbumArtworkViewボタンの境界にリサイズされ、イメージはもはやぼやけなくなりました。

以下に示すようにalbumArtworkShowingフラグがFALSEであるとき、私は他を含めるように上記handleChangesToArtworkルーチンを変更する場合:

-(void) handleChangesToArtwork { 
    ... 
    if (albumArtworkShowing) { 
     ... 
    } 
    else { 
     artworkImage = [artwork imageWithSize: albumArtworkView.bounds.size]; 
    } 
} 

を私はEXC_BAD_ACCESSを取得するときにそれがあります。このエラーは、ボタンが選択されているときにshowAlbumArtworkメソッドで発生します。具体的には、setImageの行で発生します。

メモリ管理に問題があると思われますが、どこがわからないのですか。

誰も私の方法のエラーを見ることができますか?

答えて

1

変更

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

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

にこれは、インスタンスを保持する、artworkImageプロパティのセッターが使用されていることを確認します。現在のコードでは、autoreleased UIImageを保持しないでartworkImageに割り当て、EXC_BAD_ACCESSを引き起こします。

+0

ああ!どうもありがとう。それが問題を解決しました。 – JeffB6688

+0

恐ろしい!あなたはこのマークをクリックして、この回答を受け入れることができますか? (私にいくつかのブラウニーポイントを与えて、これが正しい解決策であるという同じ問題を持つ他のSOユーザに明確にする) – adriaan

関連する問題