重新分配全局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代表自动引用计数,它负责在适当的时候为您调用retain
和release
(例如,当您更改str
的值时)。 事实上,你甚至不能手动调用这些函数,但同样的事情正在“幕后”发生。
顺便说一句,你说“我不能手动释放NSString * str,如果不是零”。 使用ARC时通常要做的用于释放对象的方法是将所有对它的引用设置nil
。 所以在这种情况下,当你想取消分配字符串时(假设str
是你唯一的引用),你只需要将str
设置为nil
: str = 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