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;
}
考虑上面的代码段。我的问题是关于“保留”的陈述。不知何故,我需要retain语句来使代码工作。我唯一的解释是当open_string超出范围时,将对其进行释放调用。因此需要保留调用以保持该值。
希望有人能证实这一点......
还想询问条件块后是否需要字符串的释放语句?
更新:(阅读了您的善意建议和宝贵的见解后)
尝试了以下修正案:
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;
}
现在一切似乎都没问题(即使没有保留声明)。
答案 0 :(得分:2)
open_string
是指向字符串文字的NSString
指针。字符串文字存在于堆栈中。在您传递对字符串文字的引用的代码中如果要保留该数据,请将它们复制到堆上。如果你拥有一个对象(即对象上称为retain / copy / new / alloc),你有责任释放它,否则你会泄漏内存。
答案 1 :(得分:1)
此代码中绝对不需要retain
。如果您遇到问题,则不在此处。将open_string
分配给警报后,您就不再需要它了。您必须在其他地方遇到内存管理问题。
问题可能是language_code
不是0和1。在这种情况下,你从未正确初始化open_string
。你应该至少指定nil或以某种方式处理这个案件。
考虑ARC,让你的生活变得更加轻松。