【问题标题】:What is the better way of handling temporary strings?处理临时字符串的更好方法是什么?
【发布时间】:2010-07-05 10:23:10
【问题描述】:

我有一种情况,我需要暂时使用一些字符串,但我阅读了很多相互矛盾的东西,以至于我有点困惑,最好的方法是什么。

我需要在 if 结构中分配一些字符串,但在 if 结构之外使用它们,因此需要在 if 之外创建它们,我在想类似的事情:

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

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

myLabel.text = arbString;
[arbString release];

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

NSString *arbString;

创建字符串变量

Google 的 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];

所以我不知道,最佳做法是什么?

【问题讨论】:

标签: cocoa initialization nsstring release allocation


【解决方案1】:

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

因此存在内存泄漏,因为您从未释放您创建的 NSString。

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

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

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

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

【讨论】:

  • 感谢您的快速回复。您回答了我的问题,但似乎我的问题措辞不正确,问题与范围有关,我有点偏离了方向。
猜你喜欢
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多