PickerView委托导致崩溃

时间:2014-04-02 08:08:03

标签: ios delegates crash uipickerview modalviewcontroller

我正在解雇一个模态视图控制器,它是delegate的{​​{1}}。

当我使用

关闭视图时
UIPickerView

我的应用程序崩溃,但仅在 [self dismissViewControllerAnimated:YES completion:NULL]; 正在显示时,并且当前是第一个响应者。

我发现崩溃的原因是僵尸,这个方法UIPickerView在我的乐器中显示为问题。

我可以通过在解除视图控制器之前将UIPicker委托和dataSource设置为nil来解决问题。

我以前从未需要这样做,有什么我想念的吗?

以下是呈现视图的简单骨骼,以模态segue呈现。当您使用IBAction解雇时,它将导致崩溃

[UIPicker _updateSelectedRows]

post有助于澄清一些事情

1 个答案:

答案 0 :(得分:3)

委托(在这种情况下,你的视图控制器)应当在点击等时将标题/行数/ whattodo等内容提供给pickerview信息。当你选择器仍然在视图上时解雇控制器。 pickerview不知道你的控制器死了&它将继续向代表询问这些信息,因此 - >崩溃。

当你设置代表&数据源为零。它将让你知道你的代表不再存在的挑选者视图,所以你不会得到崩溃。

旁注:转到代表&它显示的文档中的datasource属性

@protocol UIPickerViewDataSource, UIPickerViewDelegate;

NS_CLASS_AVAILABLE_IOS(2_0) @interface UIPickerView : UIView <NSCoding, UITableViewDataSource>

@property(nonatomic,assign) id<UIPickerViewDataSource> dataSource;                // default is nil. weak reference
@property(nonatomic,assign) id<UIPickerViewDelegate>   delegate;                  // default is nil. weak reference

你可以看到属性是“赋值”(弱)而不是“保留”(强)。因此,当你解雇代表和数据源uipickerview不会对代表的引用计数产生任何影响。它解除了分配。如果保留/强大,那将是另一种情况。您应该查看有关这些工作方式的Apple文档的内存管理主题。 https://developer.apple.com/library/mac/documentation/general/conceptual/devpedia-cocoacore/MemoryManagement.html。代表几乎一直是弱参考。