【发布时间】:2012-10-30 03:11:37
【问题描述】:
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 超出范围时,将对它进行发布调用。因此需要一个保留调用来保存该值。
希望有人能证实这一点......
还想问在条件块之后是否需要字符串的释放语句?
更新:(在阅读了您的善意建议和宝贵见解后)
尝试了以下修改:
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;
}
现在似乎一切正常(即使没有保留语句)。
【问题讨论】:
-
首先,如果
language_code不是 0 或 1,您可能在open_string变量中有一个未初始化的值(取决于 LLVM 版本)。其次,您在这里处理的是字符串常量,can have interesting reference counting behavior. -
谢谢你的评论,你和rmaddy有同样的看法吗?那是根本不需要保留调用...
-
另外,如果您想使您的应用程序国际化,您可能应该查看developer.apple.com/internationalization,因为 Apple 提供了很多有用的功能,例如
NSLocalizedString等 -
@Stanley 保留是不必要且不需要的。您所使用的所有
open_string只是作为传递给-addButtonWithTitle:的东西(它将根据需要保留字符串本身)。此外,正如上面链接的问题所指出的,字符串常量是一种特殊情况,保留和释放不能像您想象的那样工作。事实上,如果您将-retain用于其他任何事情,您将在该方法结束时泄漏内存,因为您没有与-release平衡它。同样,您还需要在初始化open_string时将其设置为 nil,否则您可能会看到奇怪的行为。 -
感谢您的宝贵见解,将按照建议再次完成整个事情。
标签: objective-c ios nsstring retaincount