我正在使用非常好的'开始IPhone开发'教自己Objective-C和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];
}
它工作正常,但是有人可以向我解释我犯了什么错误吗?
答案 0 :(得分:2)
您管理的内存不正确。什么是-initWithString:@"."
?你正在生成一个常量字符串@“。”,然后泄漏它,然后指向另一个字符串(tfUpdateText.text),然后将该指针指向标题,然后释放-text
对象。
这既是泄漏也是过度释放。这是过度释放的崩溃。
也许你的意思是:
-(IBAction)updateButtonPressed
{
[btnPressMe setTitle:tfUpdateText.text forState:UIControlStateNormal];
}
答案 1 :(得分:2)
您有内存管理错误。您要发布的newCaption
引用对象与您初始化的引用对象不同。您不小心泄露了您分配的NSString
,而是发布了tfUpdateText.text
。
您可以删除如下的文本变量:
-(IBAction)updateButtonPressed
{
[btnPressMe setTitle:tfUpdateText.text forState:UIControlStateNormal];
}
答案 2 :(得分:1)
你在这里没有正确使用NSString(并且确实做了比要求更多的工作)。 NSStrings只是指针,所以你对newCaption的第二次分配只是孤立的第一次。当您稍后发送[newCaption release]时,您不会将它发送到您的alloc'd对象,而是发送到您未保留的tfUpdateText.text。摆脱分配和释放,你应该全部设置。