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
Run Code Online (Sandbox Code Playgroud)NSMutableString *newPath = [NSMutableString stringWithCapacity:42];要么
Run Code Online (Sandbox Code Playgroud)NSMutableString *newPath = [[NSMutableString alloc] init];是否有任何特殊原因我应该使用其中一个,从表面看它似乎更容易使用第一个?
是.除非您有特殊原因,否则请立即自动释放.
第一个原因是忘记写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上),但如果你有方便的信息,为什么不使用它呢?相反,我不会忘记计算它.
我看到很多声明写在两行(即)
Run Code Online (Sandbox Code Playgroud)NSMutableString *newPath; newPath = [NSMutableString stringWithCapacity:42];我个人更喜欢单行,这只是个人风格的另一个例子吗?
是.但是,保留未初始化变量存在一定的风险.如果您决定养成这种习惯,请务必打开"运行静态分析器"构建设置.
| 归档时间: |
|
| 查看次数: |
13408 次 |
| 最近记录: |