首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义NSMutableString?

定义NSMutableString?
EN

Stack Overflow用户
提问于 2009-09-28 15:33:16
回答 6查看 13.4K关注 0票数 8

我的理解是,这两个都创建了一个NSMutableString,只有第一个归系统所有,第二个归我所有(即我需要释放它)。有没有什么特别的原因,为什么我应该使用其中之一,从表面上看,使用第一个似乎更容易?第一个是不是更好,因为它给了编译器一个大小的感觉?

代码语言:javascript
复制
NSMutableString *newPath = [NSMutableString stringWithCapacity:42];

代码语言:javascript
复制
NSMutableString *newPath = [[NSMutableString alloc] init];

编辑...也是

我看到很多声明写在两行上(即)

代码语言:javascript
复制
NSMutableString *newPath;
newPath = [NSMutableString stringWithCapacity:42];

就我个人而言,我更喜欢一行,这只是另一个个人风格的例子吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-09-28 17:15:26

NSMutableString *newPath = NSMutableString字符串容量:42;

NSMutableString *newPath = [NSMutableString分配初始化];

有没有什么特别的原因,为什么我应该使用其中之一,从表面上看,使用第一个似乎更容易?

是。总是立即自动释放,除非你有特殊的原因不这样做。

第一个原因是很容易忘记编写release消息。如果您在创建对象的同一个语句中自动释放它(就像在[[[… alloc] init] autorelease]中一样),那么要忘记它就会困难得多,而且当您这样做的时候也会更加明显。方便的工厂方法(比如stringWithCapacity:)为您自动释放对象,因此,就像您自己自动释放它一样,您不必担心稍后会释放它。

其次,即使您确实记得编写单独的release消息,也很容易没有命中它。有两种方式可以提前获得回报:

代码语言:javascript
复制
NSString *str = [[NSString alloc] initWithString:@"foo"];

BOOL success = [str writeToFile:path atomically:NO];
if (!success)
    return;

[str release];

抛出或传播异常:

代码语言:javascript
复制
NSString *str = [[NSString alloc] initWithString:@"foo"];

//Throws NSRangeException if str is not in the array or is only in the array as the last object
NSString *otherStr = [myArray objectAtIndex:[myArray indexOfObject:str] + 1];

[str release];

“不这样做的具体原因”通常是因为您有一个创建大量对象的紧密循环,在这种情况下,您可能希望手动管理循环中尽可能多的对象,以保持对象计数减少。然而,只有在您有证据表明这是您的问题时才会这样做(无论是来自Shark的硬数字,来自仪器的硬数字,还是当循环运行足够长的时候,您的系统进入分页地狱)。

其他可能更好的解决方案包括将循环拆分为两个嵌套循环(外部循环为内部循环创建和排出一个自动释放池),并切换到NSOperation。(但是,请确保对队列一次运行的操作数量设置限制-否则为you may make it even easier to go into paging hell。)

也是第一个更好的,因为它给了编译器一种大小的感觉?

这是更好的,但不是因为这个原因。

对于编译器来说,这只是另一个类消息。编译器并不知道也不关心它做了什么;它所知道和关心的是,stringWithCapacity:是向用户播放一首歌曲的消息。

它确实给了NSMutableString一个大小提示-该类将知道它最初可能想要分配多少字符存储。你从中得到的好处可能很小(至少在Mac上是这样),但是如果你手头有这些信息,为什么不使用它呢?相反,我不会不厌其烦地计算它。

我看到很多声明写在两行上(即)

NSMutableString * newPath;newPath= NSMutableString字符串容量:42;

就我个人而言,我更喜欢一行,这只是另一个个人风格的例子吗?

是。但是,将变量保留为未初始化存在一定的风险。一定要打开“Run Static Analyzer”构建设置,如果你决定这样做的话。

票数 16
EN

Stack Overflow用户

发布于 2009-09-28 15:38:35

前者不一定是针对编译器的,而是建议字符串如何能够优化其数据存储。这对于have the ability to internally change their implementations depending on the size of their data set的NSDictionary/NSArray/NSSet最有用。

除此之外,你是对的:唯一的区别是所有权问题。我几乎从不使用WithCapacity方法,而只是使用[NSMutableString string][NSMutableArray array],但这实际上只是一个风格问题,您不会因为使用其中一个方法而获得或失去任何东西。

票数 4
EN

Stack Overflow用户

发布于 2009-09-28 15:58:43

第一个是自动释放的字符串。这将由系统在适当的时候释放。它被添加到自动释放池中,内存将由系统处理。一旦它超出了范围,你就不能保证它是有效的。如果此类型仅在您的方法中具有作用域,并且还用于从方法中返回值,则此类型非常有用。

第二个被保留,因此引用计数将为1,并且不会添加到自动释放池中。您负责释放它并释放内存。如果要控制对象的范围,请使用此方法。用于成员变量等。

我相信2行初始化只是一种风格,但我不会使用2行变量,因为你在定义变量时没有给它赋值,即使你在下一行。我猜这种方式反映了成员变量的声明/初始化,但我个人不太喜欢它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1487731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档