我偶尔会遇到这种崩溃,这很难重现:
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;