黑马程序员技术交流社区

标题: initWithFormat 和stringWithFormat的区别(转) [打印本页]

作者: Sniper_YJ    时间: 2014-6-10 21:03
标题: initWithFormat 和stringWithFormat的区别(转)

差别:

1、initWithFormat是实例办法

只能经由过程 NSString* str = [[NSString alloc] initWithFormat:@"%@",@"Hello World"] 调用,然则必须手动release来开释内存资料

2、stringWithFormat是类办法

可以直接用 NSString* str = [NSString stringWithFormat:@"%@",@"Hello World"] 调用,内存经管上是autorelease的,不消手动显式release


别的国外有个贴子对此有专门评论辩论(http://www.iphonedevsdk.com/foru ... ringwithformat.html)

并且提出了一个常见错误:

label.text = [[NSString alloc] initWithFormat:@"%@",@"abc"];

最后在dealloc中将label给release掉

然则仍然会产生内存泄漏!

原因在于:用label.text = ...时,实际是隐式调用的label的setText办法,这会retain label内部的字符串变量text(哪怕这个字符串的内容跟传进来的字符串内容雷同,但体系仍然当成二个不合的字符串对象),所以最后release label时,实际上只开释了label内部的text字符串,然则最初用initWithFormat生成的字符串并未开释,终极造成了泄漏。

解决办法有二个:

1、

NSString * str = [[NSString alloc] initWithFormat:@"%@",@"abc"];

label.text = str;

[str release]

最后在dealloc中再[label release]

2、

label.text = [NSString stringWithFormat:@"%@",@"abc"];

然后剩下的工作交给NSAutoreleasePool

最后,若是你不断定你的代码是否有内存泄漏题目,可以用Xcode中的Build-->Build And Analyze 做初步的搜检.



作者: 陈超众    时间: 2014-6-10 21:37
抢个沙发,学习了
作者: 白羊爱芒果    时间: 2014-6-12 15:21
总结的挺好
作者: 无尽可能    时间: 2014-6-12 16:56
开启ARC应该就不需要管了吧
作者: chain    时间: 2014-6-12 21:33
哥们 你这资料貌似有点老了啊 现在都是ARC了啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2