NSString * str; ///< Global string.
/// Some class method
-(void) foo:(NSString*) localStr
{
str = [[NSString alloc] initWithString:localStr];
}
我正在使用ARC - 所以如果不是nil,我无法手动解除分配NSString * str。
我知道ARC在编译时运行,所以如果foo被调用两次,它就不知道在分配NSString之前是否释放NSString。
答案 0 :(得分:3)
使用ARC,如果 指向没有其他引用的字符串并将其设置为新的字符串对象,则将自动解除str
。在设置新值时,您无需担心管理旧字符串。
ARC代表自动引用计数,它会在适当的时间为您调用retain
和release
(例如当您更改str
的值时)。事实上,你甚至不能手动调用这些功能,但同样的事情正在“幕后”发生。
顺便说一句,你说“我不能手动解除分配NSString * str,如果不是nil。”。在使用ARC时,通常用于释放对象的方法是将对它的所有引用设置为nil
。因此,在这种情况下,当您想要解除分配字符串时(假设str
是您唯一的引用),您只需将str
设置为nil
:str = 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块以强制释放内存。