【问题标题】:UITextField - message sent to deallocated instance "UIKBStringWideAttributeValueForKey:"UITextField - 发送到已释放实例“UIKBStringWideAttributeValueForKey:”的消息
【发布时间】:2015-10-16 19:44:38
【问题描述】:

启用僵尸对象后,我在尝试编辑 UITextField (textLvl) 时会看到以下错误:

2013-01-13 13:27:10.509 testob[18418:907] *** -[NSConcreteMutableAttributedString
 _UIKBStringWideAttributeValueForKey:]: message sent to deallocated instance 0x2066a1f0

我已经发布了导致以下问题的代码部分,它似乎特别是“textField.text = self.storeText;”部分 - 当我对此发表评论时,问题就消失了。

您可能会说我不是最有经验的 iOS 开发人员,为什么我的 UITextView 在设置文本后会释放?请帮忙!

另外,我以前从未听说过“_UIKBStringWideAttributeValueForKey” - 有什么想法吗?

谢谢大家!

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    NSLog(@"Text began editing");
 self.storeText = textField.text;
  textField.text = @"";

}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    if (textField == textLvl){

        if ([textField.text isEqualToString:@""]){
            textField.text = self.storeText;
            NSLog(@"No Text");
        }

        self.conv = [textField.text intValue];
        if (self.conv >= 101){
            textField.text = @"100";
            UIAlertView *successAlert = [[UIAlertView alloc] initWithTitle:@"Oh no!" message:@"Can't be higher than 100." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [successAlert show]; }
        }}

【问题讨论】:

    标签: xcode ios6 uitextfield


    【解决方案1】:

    这可能是框架内部的错误。我建议你添加 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 并将文本字段文本设置为零,然后重置文本字段文本。

    【讨论】:

    • 这正是我最终所做的,它解决了问题。谢谢。
    • @humblemenon :你的回答对我有帮助。但我对此有一个疑问,在我的 UIView 中我有近 15 个 textFields ,为什么我只有其中 3 个出现这种类型的错误。
    【解决方案2】:

    我认为这里真正的答案是您正在处理一个已设置为处理 NSAttributedString 而不是 NSString 的 UITextField。您会注意到,如果您正在处理 .xib 中定义的 UITextField,它的顶部属性选项现在是“Text”,选项为 Plain 或 Attributed。

    如果您的文本字段切换到属性,如果您继续处理文本字段,就好像它是普通的一样,您会发现此错误发生。

    【讨论】:

      【解决方案3】:

      我的文本字段在一个 xib 文件中,它的委托与文件所有者挂钩。这导致我崩溃,因为文件的所有者是 NSObject。

      我实际上想将代理连接到单元,而不是文件所有者。

      【讨论】:

      • 这个问题出现在 iOS 8 中,但在 iOS 9 中会自动处理。无论如何完美的答案。
      【解决方案4】:

      使用工具查看保留/释放:

      如果您需要查看对象的保留、释放和自动释放发生的位置,请使用工具:

      在仪器中运行,在分配中将“记录引用计数”设置为开启(您必须停止记录才能设置选项)。使选取器运行,停止记录,在那里搜索 ivar (datePickerView),向下钻取,您将能够看到所有保留、释放和自动释放发生的位置。

      【讨论】:

      • 不幸的是,我不擅长使用这些信息。 :(这不是人们以前见过的吗?
      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多