2010-07-05 105 views
0

我有一种情况,我需要暂时使用一些字符串,但是我已经阅读了许多相互冲突的内容,所以我对有什么最好的处理方式感到困惑。处理临时字符串的更好方法是什么?

我需要指定一些字符串内的,如果结构,但使用它们,如果结构之外所以他们需要的,如果,我是想这样外部创建:

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

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

myLabel.text = arbString; 
[arbString release]; 

我所看到的例子,人们只是使用:

NSString *arbString; 

创建字符串变量

谷歌的目标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]; 

所以我不知道,这是最好的实践?

+0

这回答了我的问题,似乎我只是不正确的措辞。 http://stackoverflow.com/questions/2706955/objective-c-if-statements-not-retaining/2706957#2706957 – 2010-07-05 12:26:09

回答

1

在您发布的示例中,实际上您将丢失对在arbString = @"Whatever"中指定的NSString的引用。然后释放字符串常量(顺便说一句,这是不可释放的)。

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

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

至于这个问题,在这个例子中,你不需要[[NSString alloc] init]。您无需将字符串复制到本地变量中,只需将myLabel.text设置为字符串常量@"Whatever"即可。

(编辑:这是不是说你不能使用你的指针arbStringarbString = @"Whatever"; myLabel.text = arbString是好的,但这个只是指针赋值,不是抄袭。)

如果你需要操作字符串,你回来之前, ,你会创建一个NSMutableString,并且释放或者自动释放它。个人而言,使用类方法创建自动释放对象,因此在本例中,我使用[NSString string][NSString stringWithString:],它们返回自动释放对象。

+0

感谢您的快速回复。你回答了我所问的问题,但似乎我错误地说了这个问题,问题与范围有关,而且我有点偏离正轨。 – 2010-07-05 12:32:35

相关问题