定义NSMutableString?

fuz*_*oat 8 cocoa objective-c nsmutablestring

我的理解是这两个都创建了一个NSMutableString,只有第一个由系统拥有,第二个由我拥有(即我需要释放它).是否有任何特殊原因我应该使用其中一个,从表面看它似乎更容易使用第一个?也是第一个更好的,因为它给编译器一个大小的感觉?

NSMutableString *newPath = [NSMutableString stringWithCapacity:42];
Run Code Online (Sandbox Code Playgroud)

要么

NSMutableString *newPath = [[NSMutableString alloc] init];
Run Code Online (Sandbox Code Playgroud)

编辑......还

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

NSMutableString *newPath;
newPath = [NSMutableString stringWithCapacity:42];
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*sey 16

NSMutableString *newPath = [NSMutableString stringWithCapacity:42];
Run Code Online (Sandbox Code Playgroud)

要么

NSMutableString *newPath = [[NSMutableString alloc] init];
Run Code Online (Sandbox Code Playgroud)

是否有任何特殊原因我应该使用其中一个,从表面看它似乎更容易使用第一个?

是.除非您有特殊原因,否则请立即自动释放.

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

其次,即使你记得写下单独的release信息,也很容易不打它.两种方式是早期回报:

NSString *str = [[NSString alloc] initWithString:@"foo"];

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

[str release];
Run Code Online (Sandbox Code Playgroud)

抛出或传播的异常:

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];
Run Code Online (Sandbox Code Playgroud)

"具体原因不是"通常是你有一个紧凑的循环来创建很多对象,在这种情况下你可能想要手动管理循环中的尽可能多的对象,以保持你的对象数量下.但是,只有当你有证据证明这是你的问题时才会这样做(无论是来自Shark的硬数字,来自乐器的硬数字,还是你的系统在该循环运行足够长时间进入分页地狱).

其他可能更好的解决方案包括将循环分成两个嵌套循环(外部循环为内循环创建和排出自动释放池)并切换到NSOperation.(但是,请确保您对队列一次运行的操作数量设置了限制 - 否则,您可能会更容易进入分页地狱.)

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

它更好,但不是因为这个原因.

对于编译器来说,它只是另一个类消息.编译器不知道或不关心它做什么; 对于它所知道和关心的所有stringWithCapacity:信息,是向用户播放歌曲的信息.

它确实给NSMutableString一个大小提示 - 该类将知道它最初可能想要分配多少字符存储.你从中获得的好处可能很小(至少在Mac上),但如果你有方便的信息,为什么不使用它呢?相反,我不会忘记计算它.

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

NSMutableString *newPath;
newPath = [NSMutableString stringWithCapacity:42];
Run Code Online (Sandbox Code Playgroud)

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

是.但是,保留未初始化变量存在一定的风险.如果您决定养成这种习惯,请务必打开"运行静态分析器"构建设置.

  • +1,除非我不同意"除非您有特殊原因不要立即自动释放".你的理由("很容易忘记编写`release`消息")现在并不像静态分析器很容易发现这个错误那么重要.我个人避免自动释放的对象,只是为了避免自动释放池杂乱和可能来自排出一个非常大的自动释放池(这是,我注意到)的命中.我通常倾向于通过合理的可能性尽快摊销解除分配的成本. (4认同)