处理临时字符串的更好方法是什么?

时间:2010-07-05 10:23:11

标签: cocoa initialization nsstring release allocation

我有一种情况,我需要暂时使用一些字符串,但我已经阅读了很多相互矛盾的事情,我对于最好的方法有点困惑。

我需要在if结构中分配一些字符串,但是在if结构之外使用它们,所以它们需要在if之外创建,我想的是:

NSString *arbString = [[NSString alloc] init];

if(whatever)
{
    arbString = @"Whatever"
}
else
{
    arbString = @"SomethingElse"
}

myLabel.text = arbString;
[arbString release];

我见过人们刚刚使用的例子:

NSString *arbString;

创建字符串变量

谷歌的Objective C指南说创建时最好自动发布:

“创建新的临时对象时,请在创建它们的同一行自动释放它们,而不是稍后在同一方法中单独发布”:

// AVOID (unless you have a compelling performance reason)
MyController* controller = [[MyController alloc] init];
// ... code here that might return ...
[controller release];

// BETTER
MyController* controller = [[[MyController alloc] init] autorelease];

所以我不知道,这是最好的做法?

1 个答案:

答案 0 :(得分:1)

在您发布的示例中,您实际上丢失了在arbString = @"Whatever"中分配时创建的NSString的引用。然后释放字符串常量(顺便说一下,这是不可释放的)。

因为你永远不会释放你创建的NSString,所以会出现内存泄漏。

请记住,所有这些类型都是指针,因此=只会重新分配它们。

至于问题,在本例中,您不需要[[NSString alloc] init]。无论如何,您无需将字符串复制到局部变量中,只需将myLabel.text设置为字符串常量@"Whatever"

(编辑:那并不是说你不能使用你的指针arbStringarbString = @"Whatever"; myLabel.text = arbString没问题。但这只是指针赋值,而不是复制)

如果在返回之前需要操作字符串,则需要创建一个NSMutableString,然后释放或自动释放它。就个人而言,使用类方法创建自动释放的对象,因此在此示例中,我将使用[NSString string][NSString stringWithString:]来返回自动释放的对象。