“无法识别的选择器发送到实例”和NSURL

时间:2014-07-09 15:18:59

标签: ios nsurl unrecognized-selector

我在调试区域收到此消息,但它不会阻止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(已编辑):

Exception stack trace

以下行显示为断点1.1并突出显示:

_player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];

1 个答案:

答案 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],以确保它们符合您的预期。