从另一个类获得的NSString会导致崩溃

时间:2012-10-15 13:23:29

标签: iphone memory-management nsstring

我的iPhone应用程序是Tab based。在标签中,例如Security Tab我有三个视图控制器First, Second, Third。我正在从Third视图控制器向Second视图控制器传递字符串值。 selectedAlertDesc是Third视图控制器的NSString对象。

Third视图控制器中:

@property (nonatomic,retain) NSString *selectedAlertDesc;
@synthesize selectedAlertDesc = _selectedAlertDesc;

Second视图控制器中:

Third *controller = [[Third alloc] init];
[controller setSelectedAlertDesc:[[alertArray objectAtIndex:indexPath.row] objectForKey:@"alertDesc"]];
[self.navigationController pushViewController:controller animated:YES];
[controller release];

它工作正常,直到我更改标签。如果我将安全选项卡保留在Third视图控制器页面中,并在访问其他选项卡后返回,则会崩溃。它说,selectedAlertDesc变成了僵尸。

-[CFString stringByReplacingOccurrencesOfString:withString:]: message sent to deallocated instance 0xeb3d760

我该如何解决这个问题?我相信我们不应该初始化合成对象。我忘记了什么吗?

修改

根据建议,我使用工具检查分配/保留历史记录。我得到以下内容: - 因此在使用selectedAlertDesc之后,我保留了它。这是正确的方法吗?它运作正常!!

_selectedAlertDesc = [_selectedAlertDesc stringByReplacingOccurrencesOfString:@"opentag" withString:@"<"];
_selectedAlertDesc = [_selectedAlertDesc stringByReplacingOccurrencesOfString:@"closetag" withString:@">"];
[txtTxtVw setText:_selectedAlertDesc];

enter image description here

1 个答案:

答案 0 :(得分:0)

来自评论:

事实证明,错误是由直接将新值分配给实例变量的代码引起的,而不是使用相关属性的set...方法(或其对应的点表示法)。这会绕过属性属性并导致分配自动释放的字符串。

(主要线索是仪器保留历史记录中缺失的条目。)