BAD_ACCESS&使用UIPickerView时出现NSInvalidArgumentException

时间:2013-10-18 11:34:02

标签: ios objective-c delegates datasource uipickerview

我是初学者,与UIKit合作。当我厌倦了在iOS 7 SDK中使用UIPickerView时,我遇到了一个难以解决的问题。

我们知道UIPickerView需要两个资源才能完美运行:dataSource&代表。所以我写了一个名为“KMPickerProtocols”的类。我将它采用到UIPickerViewDataSource& UIPickerViewDelegate协议,然后我添加了一些额外的setter方法。

KMPickerProtocols被用于dataSource的所有基本方法和委托协议+用于设置每行标题的必要可选方法(pickerView:titleForRow:forComponent)。所有这些方法都可以毫无问题地完成任务(在正常情况下)。

最后,我用这段代码手动设置了UIPickerView(名为_accountPicker)的委托和dataSource属性:

 NSArray *delegateAgent = [[KMTwitterDelegate new] run ];
_accountPicker.dataSource = [delegateAgent objectAtIndex:0];
_accountPicker.delegate = [delegateAgent objectAtIndex:1] ;

(run方法旨在设置一些属性,包括每行的高度和......)

现在,当我运行我的应用程序时,它将以UIPickerView的形式显示我的twitterAccounts存储在系统(帐户框架)中。但是有一个问题:只要我滚动选择器视图或点击任何一行,程序就会崩溃,我在这行代码中得到BAD_ACCESS(code = 2,address = 0x1):

@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([KMAppDelegate class]));
}

并且有时我在上面的行中得到信号SIGABRT。在这些情况下Log说:

  

由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [ NSMallocBlock pickerView:titleForRow:forComponent:]:无法识别的选择器发送到实例0x8c75ad0'

如果您帮我处理这个问题,我将不胜感激。我真的不知道bug在哪里。但我想这个屏幕截图有助于找到:

First implementation of method  Second implementation Third implementation

上面屏幕截图中的问题是UIPicker为第0行调用了“pickerView:titleForRow:forComponent”方法,三次而不是一次。我只是不知道这是因为myFault还是因为UIPicker的典型行为。

1 个答案:

答案 0 :(得分:0)

您正在将消息pickerView:titleForRow:forComponent:发送到NSMallocBlock类型的对象。这是一个从选择器自动发送到其数据源的消息,所以我的假设是你要分配数据源:

_accountPicker.dataSource = [delegateAgent objectAtIndex:0];

您指定的数据源不符合协议UIPickerViewDataSource

检查返回[delegateAgent objectAtIndex:0];的内容并确保它符合您的预期。