当它指向一个文字时,我应该保留NSString吗?

if (url_leng) { NSString *open_string; if (g_system_status.language_code == 0) open_string = @"Open"; else if (g_system_status.language_code == 1) open_string = @"Abrir"; [open_string retain]; [alert addButtonWithTitle : open_string]; g_scan_result = targ_url; } 

考虑上面的代码段。 我的问题是关于“保留”声明。 不知何故,我需要保留声明,使代码工作。 我唯一的解释是,当open_string超出范围时,会发起一个释放调用。 因此需要保留电话来保持价值。

希望有人能证实这一点…

还想问在条件块之后是否需要释放语句的string?


更新:(通过阅读您的善意build议和宝贵的见解)

已经尝试了下面的修改:

  if (url_leng) { if (g_system_status.language_code == 0) [alert addButtonWithTitle : @"Open"]; else if (g_system_status.language_code == 1) [alert addButtonWithTitle : @"Abrir"]; else [alert addButtonWithTitle : @"Open"]; g_scan_result = targ_url; } 

现在一切都好了(即使没有保留声明)。

这个代码绝对不需要retain 。 如果你有问题,这不是在这里。 一旦open_string分配给警报,你不再需要它了。 您必须在别处有内存pipe理问题。

也许问题是如果language_code不是0和1.在这种情况下,你永远不会正确地初始化open_string 。 你应该至less分配零或以某种方式处理这个其他情况。

考虑ARC,让你的生活变得如此简单。

open_string是一个指向string文字的NSString指针。 string文字居住在堆栈上。 在你的代码中,你传递的是string的引用如果你想保存这些数据,把它们复制到堆上。 如果你拥有一个对象(也就是在对象上叫做retain / copy / new / alloc),你有责任释放它,否则你会泄漏内存。