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

时间:2012-10-30 03:11:37

标签: objective-c ios nsstring retaincount

    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;               
    }

现在一切似乎都没问题(即使没有保留声明)。

2 个答案:

答案 0 :(得分:2)

open_string是指向字符串文字的NSString指针。字符串文字存在于堆栈中。在您传递对字符串文字的引用的代码中如果要保留该数据,请将它们复制到堆上。如果你拥有一个对象(即对象上称为retain / copy / new / alloc),你有责任释放它,否则你会泄漏内存。

答案 1 :(得分:1)

此代码中绝对不需要retain。如果您遇到问题,则不在此处。将open_string分配给警报后,您就不再需要它了。您必须在其他地方遇到内存管理问题。

问题可能是language_code不是0和1。在这种情况下,你从未正确初始化open_string。你应该至少指定nil或以某种方式处理这个案件。

考虑ARC,让你的生活变得更加轻松。