代码之家  ›  专栏  ›  技术社区  ›  Toby Allen mercator

按钮上的标题更新导致IPhone应用程序崩溃

  •  0
  • Toby Allen mercator  · 技术社区  · 15 年前

    我目前正在自学Objective-C和Iphone开发,使用非常好的“开始Iphone开发”。我一直在玩一个示例应用程序,当按下另一个按钮时,我试图用文本字段中的文本更新一个按钮。我已经设置了我的动作和链接以及所有这些。单个方法/函数/调用的代码如下所示

    -(IBAction)updateButtonPressed
    {
    NSString *newCaption = [[NSString alloc] initWithString:@"."];
    
    newCaption = tfUpdateText.text;
    [btnPressMe setTitle:newCaption forState:UIControlStateNormal];
    
    [newCaption release];
    
    
    }  
    

    更新:

    如果我换成这个

    -(IBAction)updateButtonPressed
    {
    
    [btnPressMe setTitle:tfUpdateText.text forState:UIControlStateNormal];
    
    
    
    }  
    

    它工作正常,但有人能解释一下我犯了什么错误吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Rob Napier    15 年前

    -initWithString:@"." 对于您正在生成一个常量字符串@“”,然后泄漏它,然后指向另一个字符串(tfUpdateText.text),然后将该指针指定给标题,然后释放 -text 对象

    这既是泄漏也是过度释放。是过度释放导致崩溃。

    也许你的意思是:

    -(IBAction)updateButtonPressed
    {
        [btnPressMe setTitle:tfUpdateText.text forState:UIControlStateNormal];
    }
    
        2
  •  2
  •   notnoop    15 年前

    newCaption 您正在释放的引用对象与您初始化的引用对象不同。你不小心把水漏了 NSString 你分配了,并且释放了 tfUpdateText.text 相反

    您可以删除temperory变量,如下所示:

    -(IBAction)updateButtonPressed
    {
        [btnPressMe setTitle:tfUpdateText.text forState:UIControlStateNormal];
    }
    
        3
  •  1
  •   Ben Gottlieb    15 年前

    您在这里没有正确使用NSString(而且实际做的工作比要求的多得多)。nsstring只是指针,因此您对newCaption的第二个赋值只是孤立第一个赋值。当您稍后发送[newCaption release]时,您并没有将其发送到您的alloc'd对象,而是发送到您没有保留的tfUpdateText.text。去掉alloc和release,你应该已经准备好了。