重新分配全局NSString指针

NSString * str;  ///< Global string.

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

我使用ARC - 所以我不能手动释放NSString * str,如果不是零。

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


使用ARC,如果它指向一个没有其他引用的字符串,并且将它设置为一个新的字符串对象,它自动释放str 。 当您设置新值时,您不必担心管理旧字符串。

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

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

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

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

如果您真的打算制作副本,则可以将其替换为:

str = [localStr copy];

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

str = localStr;

如果你试图只创建字符串,如果它尚未被创建,你可以这样做:

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

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

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

str = nil;

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

链接地址: http://www.djcxy.com/p/84277.html

上一篇: Reassign global NSString pointer

下一篇: how to avoid (potential) memory leak