我正在解雇一个模态视图控制器,它是delegate
的{{1}}。
当我使用
关闭视图时UIPickerView
我的应用程序崩溃,但仅在 [self dismissViewControllerAnimated:YES completion:NULL];
正在显示时,并且当前是第一个响应者。
我发现崩溃的原因是僵尸,这个方法UIPickerView
在我的乐器中显示为问题。
我可以通过在解除视图控制器之前将UIPicker委托和dataSource设置为nil来解决问题。
我以前从未需要这样做,有什么我想念的吗?
以下是呈现视图的简单骨骼,以模态segue呈现。当您使用IBAction解雇时,它将导致崩溃
[UIPicker _updateSelectedRows]
这post有助于澄清一些事情
答案 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。代表几乎一直是弱参考。