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

现在一切似乎都很好(即使没有保留语句)。

4

2 回答 2

2

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

于 2012-10-30T03:21:47.960 回答
1

retain代码中绝对不需要。如果你有问题,它不在这里。一旦open_string分配给警报,您就不再需要它了。您必须在其他地方遇到内存管理问题。

也许问题在于 是否language_code不是 0 和 1。在这种情况下,您永远不会正确初始化open_string。您至少应该分配 nil 或以某种方式处理这种情况。

考虑 ARC,让您的生活更轻松。

于 2012-10-30T03:18:42.510 回答