1
NSString * str;  ///< Global string.

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

我正在使用 ARC - 所以如果不是 nil,我无法手动释放 NSString* str。

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

4

2 回答 2

3

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

ARC 代表 Automatic Reference Counting,它会在适当的时间(例如当您更改 的值时)为您调用retain和处理。事实上,您甚至不能再手动调用这些函数,但同样的事情正在“幕后”发生。releasestr

顺便说一句,您说“如果不是 nil,我无法手动释放 NSString* str。”。使用 ARC 时解除分配对象的通常做法是将对其的所有引用设置为nil. 因此,在这种情况下,当您想要解除分配字符串(假设这str是您对它的唯一引用)时,您只需设置strnil: str = nil;。但是请记住,正如我上面所说,您不需要为了设置str新值而执行此操作。ARC 足够聪明,可以同时兼顾两者。

另一边:您有以下代码行:

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

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

str = [localStr copy];

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

str = localStr;
于 2013-01-30T01:14:03.830 回答
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 块以强制释放内存。

于 2013-01-30T01:23:58.960 回答