我在调试区域收到此消息,但它不会阻止iPhone模拟器:
-[__NSCFString _getValue:forType:]: unrecognized selector sent to instance
它出现在以下几行中:
NSString *urlString = [NSString stringWithFormat:@"%@", [array objectAtIndex:6]] ;
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:urlString ofType:@"m4a"]];
NSLog(@"object class: %@", [[array objectAtIndex:6] class]);
NSError *error;
_player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
if (error)
{
NSLog(@"Error in audioPlayer: %@",
[error localizedDescription]);
} else {
_player.delegate = self;
[_player prepareToPlay];
}
我的数组的对象6是一个字符串“question1”,而question1.m4a是一个音频文件,然后用AVAudioPlayer
实例读取。
问题出在哪里?
编辑: 完整错误行:
2014-07-09 16:23:41.007 TOEIC3[8497:60b] -[__NSCFString _getValue:forType:]: unrecognized selector sent to instance 0xb42ee40
EDIT2: 数组定义:
<array>
<string>P2.png</string>
<string>A</string>
<string>B</string>
<string>C</string>
<string>D</string>
<string>3</string>
<string>question1</string>
</array>
来自调试区的消息:
(lldb) po [array class]
__NSCFArray
(lldb) po [[array objectAtIndex:6] class]
__NSCFString
此外,根据断点,错误出现在此行之后:
_player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
我在.m4a文件中遇到此错误,但在.aiff中没有原始文件。 它可能来自转换过程中的信息丢失吗?
EDIT3:
object class urlString: __NSCFString
object class url: NSURL
EDIT4(已编辑):
以下行显示为断点1.1并突出显示:
_player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
答案 0 :(得分:0)
unrecognized selector
通常是内存管理问题的一个标志。数组或其第6个元素指向您不想要的东西。如果您的对象未正确保留,可能会发生这种情况 - 允许它们过早地被解除分配。发生这种情况时,内存将被释放,并且可以分配给任何其他对象并由其占用。
您需要验证如何管理array
以确定问题。如果您更新了问题以包含array
的来源及其内容,我们可以提供更好的答案。它将允许我们分析如何保留/解除分配。
在NSString *urlString = [NSString stringWithFormat:@"%@", [array objectAtIndex:6]];
设置断点,运行应用并执行操作以获取此代码。当它将类型po [array class]
暂停到调试器窗口时。
这将告诉您是否实际指向NSArray实例,或者是否已经消失,而其他东西现在占用了该内存空间。
您还应该检查第6个元素:po [[array objectAtIndex:6] class]
及其值po [array objectAtIndex:6]
,以确保它们符合您的预期。