ときどきこのクラッシュが発生しますが、これを再現するのは非常に困難です。
0 CoreFoundation 0x39ff73e2 __exceptionPreprocess + 158
1 libobjc.A.dylib 0x3905095e objc_exception_throw + 26
2 CoreFoundation 0x39ffaf2c -[NSObject(NSObject) doesNotRecognizeSelector:] + 180
3 CoreFoundation 0x39ff9648 ___forwarding___ + 388
4 CoreFoundation 0x39f51204 _CF_forwarding_prep_0 + 20
5 Foundation 0x32914bec -[NSDictionary(NSKeyValueCoding) valueForKey:] + 28
6 MyAppName 0x00032112 -[myViewController stopPlayersWithVolume:] (myViewController.m:151)
このコードから:
- (void)stopPlayersWithVolume:(double)volume
{
for (NSString *file in players)
{
AVAudioPlayer *player = [players valueForKey:file];
if (player.volume == volume || volume == 0)
[player stop];
}
}
players
はNSMutableDictionary
プロパティでself.
あり、ARCで必要とは思わないため、アクセスせずにアクセスします。キーはファイル名(「mysound.mp3」など)であり、値はAVAudioPlayer
オブジェクトです。
スタックトレースは、file
渡したパラメーター[NSMutableDictionary valueForKey]
が実際にはではなくNSString
、したがって認識されないセレクターではないことを示していますか?ディクショナリを介した高速な列挙から予想されるように、これは常にNSString
デバッガー内にありますが、デバッガーでクラッシュが発生することはありません。
私の唯一の考えは、辞書を破壊するスレッドの問題があるということです。上記のコードはNSTimerによって起動されていますが、これは実行ループを介した単なるメッセージであり、個別のスレッドではないため、クロススレッドアクセスについて心配する必要はないと思いますか?
任意の提案をいただければ幸いです。これを捨てて申し訳ありませんが、私は立ち往生しています。
編集:
プレーヤー辞書は次のように割り当てられviewDidLoad
ます。
players = [[NSMutableDictionary alloc] init];
そして、次のように宣言されています:
@property (retain, nonatomic) NSMutableDictionary *players;
そして次のように合成されます:
@synthesize players;