ios - PickerView 委托(delegate)导致崩溃

标签 ios delegates crash uipickerview modalviewcontroller

我正在解雇一个模态视图 Controller ,它是 UIPickerView委托(delegate)

当我使用关闭 View 时

    [self dismissViewControllerAnimated:YES completion:NULL];

我的应用程序崩溃,但仅当 UIPickerView 显示且当前是第一响应者时才崩溃。

我发现崩溃的原因是僵尸,此方法,[UIPicker _updateSelectedRows] 在我的仪器中显示为问题。

我可以通过在关闭 View Controller 之前将 UIPicker 委托(delegate)和 dataSource 设置为 nil 来解决该问题。

我以前从未需要这样做,我是否缺少什么?

这里是呈现 View 的基本框架,以模态 Segue 形式呈现。当您使用 IBAction 关闭此操作时,它将导致崩溃

@interface VTSecViewController () <UIPickerViewDataSource, UIPickerViewDelegate>

@property (strong, nonatomic) UIPickerView *catPicker;
@property (strong, nonatomic) NSArray *catItems;
@property (weak, nonatomic) IBOutlet UITextField *pickerTF;

@end

@implementation VTSecViewController

- (IBAction)dismpress:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:NULL];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.catItems = @[@"one", @"two"];
    self.catPicker = [[UIPickerView alloc] init];
    self.pickerTF.inputView = self.catPicker;
    self.catPicker.delegate = self;
    self.catPicker.dataSource = self;
    [self.pickerTF becomeFirstResponder];
    // Do any additional setup after loading the view.
}

#pragma mark PickerView DataSource

- (NSInteger)numberOfComponentsInPickerView: (UIPickerView *)pickerView
{
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return [self.catItems count];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    self.pickerTF.text = self.catItems[row];
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return self.catItems[row];
}


@end

这个post帮助澄清一些事情

最佳答案

委托(delegate)(在本例中是您的 View Controller )应该向 pickerview 提供有关标题/行数/点击时执行的操作等信息。当您在选择器仍在 View 上时关闭 Controller 时。 pickerview 不知道你的 Controller 死了,它会不断向委托(delegate)询问这些信息,因此 -> 崩溃。

当您将委托(delegate)和数据源设置为 nil 时。它会让pickerview知道你的委托(delegate)不再存在,这样你就不会崩溃。

旁注:转到它显示的文档中的委托(delegate)和数据源属性

@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

您可以看到属性是“分配”(弱)而不是“保留”(强)。因此,当您解除委托(delegate)和数据源时,uipickerview 不会对委托(delegate)的引用计数产生任何影响,并且它会解除分配。如果保留/强大的话,情况就会有所不同。您可能应该查看苹果文档上的内存管理主题,了解它们如何工作。 https://developer.apple.com/library/mac/documentation/general/conceptual/devpedia-cocoacore/MemoryManagement.html 。委托(delegate)几乎一直都是弱引用。

关于ios - PickerView 委托(delegate)导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22805187/

相关文章:

delegates - 通过 Swift 访问委托(delegate)的正确方法是什么?

c++ - 使用 GDI+ 注入(inject) DLL 导致记事本崩溃

iphone - 在循环中使用CTFontRef创建NSMutableAttributedString时出现问题

iOS:类的实例返回一个 View ,这个 View 有不起作用的按钮

objective-c - Objective-C/iOS : Look through a document for any one of several thousand words?

ios - 将 #s 数组存储到 NSUserDefaults,为与数组中的 # 匹配的每个单元格行添加复选标记

iphone - 想要创建一个在我的应用程序范围内的日历

ios - 文本字段应该返回,这对 ios7 是否正确?

objective-c - Objective-C 中的异常/错误处理(iPhone 应用程序)

c# - dSYM 文件夹和 mSYM 文件夹有什么区别?