应用程序崩溃,因为正在释放方法

时间:2014-09-16 21:05:43

标签: objective-c ios7 uitextfield uitextfielddelegate

我有这个代码在UIPopover中创建40个UITextFields;当我尝试在其中一个textField中放一个数字时,应用程序会崩溃:

  

- [ImportTABDelimitedFile respondsToSelector:]:发送到解除分配的实例的消息

这是创建文本字段的代码:

//  create the uitextfields for user to match against their input file columns
CGRect nbrFieldRect = CGRectMake(x-20, y, 26.0f, 26.0f);
UITextField *nbrTextField = [[UITextField alloc] initWithFrame:nbrFieldRect];
if(colorYES)
    nbrTextField.backgroundColor = UIColorFromRGB(0xFFF9AF);
else
    nbrTextField.backgroundColor = [UIColor whiteColor];

nbrTextField.enabled = YES;
[nbrTextField setKeyboardType:UIKeyboardTypeNumberPad];
nbrTextField.textColor = [UIColor blackColor];
nbrTextField.tag = tagNumber + 100;  //  range: 170-215
nbrTextField.font = [UIFont systemFontOfSize:12.0f];
nbrTextField.borderStyle = UITextBorderStyleRoundedRect;
nbrTextField.returnKeyType = UIReturnKeyNext;
nbrTextField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
[nbrTextField addTarget:self action:@selector(mapUserFields) forControlEvents: UIControlEventEditingDidEnd];
nbrTextField.delegate = self;
[theView addSubview:nbrTextField];

这是 mapUserFields 的代码:

-(void)mapUserFields  {

    NSLog(@"mapUserFields: textFieldDidEndEditing");
}

UPDATE#2 我运行了Instruments,它显示方法正在被释放,导致崩溃;这是仪器输出的图像: enter image description here

现在,问题是:为什么方法被解除分配,我该如何解决?

3 个答案:

答案 0 :(得分:2)

您在创建文本字段时添加委托并设置其他属性,如下所示:

UITextField *nbrTextField = [[UITextField alloc] initWithFrame:nbrFieldRect];
nbrTextField.delegate = self;

并实现其委托方法,当您从键盘输入键时调用该方法:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

您发布的上述代码到目前为止看起来很好,直到您发布崩溃日志。

编辑:您发布的崩溃日志建议添加为ImportTABDelimitedFile文本字段事件的观察者的对象(在此情况下为UIControlEventEditingDidEnd)。< / p>

您是否可以通过创建具有保留类型的属性以及将属性集nil解除为弹出变量来确保您在展示类中保留的一个东西popover。例如:

@property (nonatomic, retain) UIPopoverController *popoverController;

并且不要忘记在弹出窗口时初始化并指定此属性。将其委托设置为自己,如下所示:

popoverController.delegate = self;

不要忘记实现委托,并在委托方法中,清除属性变量,如下所示:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController{
    self.popoverController = nil; //if you are using non-arc, release it.
}

答案 1 :(得分:1)

我发现了问题(在Michael Dautermann的帮助下)......我不得不将被调用的方法变为如下属性:

iTABFile = [[ImportTABDelimitedFile alloc]init];

现在,它还没有发布,而且像冠军一样!谢谢大家的帮助;对此,我真的非常感激。 SD

答案 2 :(得分:0)

我猜这里没有看到其余的代码,但你需要做两件事。首先,设置创建所有textFields的类以符合UITextFieldDelegate协议。我觉得你粘贴上面代码的课程就是那个。

这是在头文件(.h)

中完成的

同样,在创建40多个文本字段时,请设置:

nbrTextField.delegate = self;

将当前类作为UITextFields的委托。

希望这有帮助