使用ARC重新分配全局NSString指针

时间:2013-01-30 01:08:32

标签: objective-c automatic-ref-counting

NSString * str;  ///< Global string.

/// Some class method
-(void) foo:(NSString*) localStr
{
    str = [[NSString alloc] initWithString:localStr];
}

我正在使用ARC - 所以如果不是nil,我无法手动解除分配NSString * str。

我知道ARC在编译时运行,所以如果foo被调用两次,它就不知道在分配NSString之前是否释放NSString。

2 个答案:

答案 0 :(得分:3)

使用ARC,如果 指向没有其他引用的字符串并将其设置为新的字符串对象,则自动解除str。在设置新值时,您无需担心管理旧字符串。

ARC代表自动引用计数,它会在适当的时间为您调用retainrelease(例如当您更改str的值时)。事实上,你甚至不能手动调用这些功能,但同样的事情正在“幕后”发生。

顺便说一句,你说“我不能手动解除分配NSString * str,如果不是nil。”。在使用ARC时,通常用于释放对象的方法是将对它的所有引用设置为nil。因此,在这种情况下,当您想要解除分配字符串时(假设str是您唯一的引用),您只需将str设置为nilstr = nil;。但请记住,正如我上面所说,为了将str设置为新值,您不需要这样做。 ARC非常聪明,可以同时处理这两种情况。

另一方面:您有以下代码行:

str = [[NSString alloc] initWithString:localStr];

如果您确实打算制作副本,可以将其替换为:

str = [localStr copy];

它更短,更容易理解。更有可能的是,您不需要实际的副本,您可以保留对现有字符串的引用,因此您可以使用:

str = localStr;

答案 1 :(得分:1)

如果您尝试仅创建字符串(如果尚未创建),则可以执行此操作:

NSString * str = nil;  ///< Global string.

/// Some class method
-(void) foo:(NSString*) localStr
{
    if(!str)//only create if it is not already created
    {
        str = [[NSString alloc] initWithString:localStr];
    }
}

如果您在分配新字符串之前尝试删除旧字符串,那么当您分配新字符串并离开函数范围时,它将发生变形。没有必要明确地“释放”字符串。

如果你明确想告诉程序你不需要字符串,你可以这样做:

str = nil;

将删除str的强字符串指针。除非您处于在范围内创建许多(或非常大)字符串的情况,否则您通常可以使用上述字符串。但是,您可以查看@autoreleasepool块以强制释放内存。