我的理解是,这两个都创建了一个NSMutableString,只有第一个归系统所有,第二个归我所有(即我需要释放它)。有没有什么特别的原因,为什么我应该使用其中之一,从表面上看,使用第一个似乎更容易?第一个是不是更好,因为它给了编译器一个大小的感觉?
NSMutableString *newPath = [NSMutableString stringWithCapacity:42];或
NSMutableString *newPath = [[NSMutableString alloc] init];编辑...也是
我看到很多声明写在两行上(即)
NSMutableString *newPath;
newPath = [NSMutableString stringWithCapacity:42];就我个人而言,我更喜欢一行,这只是另一个个人风格的例子吗?
发布于 2009-09-28 17:15:26
NSMutableString *newPath = NSMutableString字符串容量:42;
或
NSMutableString *newPath = [NSMutableString分配初始化];
有没有什么特别的原因,为什么我应该使用其中之一,从表面上看,使用第一个似乎更容易?
是。总是立即自动释放,除非你有特殊的原因不这样做。
第一个原因是很容易忘记编写release消息。如果您在创建对象的同一个语句中自动释放它(就像在[[[… alloc] init] autorelease]中一样),那么要忘记它就会困难得多,而且当您这样做的时候也会更加明显。方便的工厂方法(比如stringWithCapacity:)为您自动释放对象,因此,就像您自己自动释放它一样,您不必担心稍后会释放它。
其次,即使您确实记得编写单独的release消息,也很容易没有命中它。有两种方式可以提前获得回报:
NSString *str = [[NSString alloc] initWithString:@"foo"];
BOOL success = [str writeToFile:path atomically:NO];
if (!success)
return;
[str release];抛出或传播异常:
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”构建设置,如果你决定这样做的话。
发布于 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],但这实际上只是一个风格问题,您不会因为使用其中一个方法而获得或失去任何东西。
发布于 2009-09-28 15:58:43
第一个是自动释放的字符串。这将由系统在适当的时候释放。它被添加到自动释放池中,内存将由系统处理。一旦它超出了范围,你就不能保证它是有效的。如果此类型仅在您的方法中具有作用域,并且还用于从方法中返回值,则此类型非常有用。
第二个被保留,因此引用计数将为1,并且不会添加到自动释放池中。您负责释放它并释放内存。如果要控制对象的范围,请使用此方法。用于成员变量等。
我相信2行初始化只是一种风格,但我不会使用2行变量,因为你在定义变量时没有给它赋值,即使你在下一行。我猜这种方式反映了成员变量的声明/初始化,但我个人不太喜欢它。
https://stackoverflow.com/questions/1487731
复制相似问题