initWithFormat与initWithString的区别、initWithFormat与stringWithFormat的区别

一、initWithFormat会创建新空间,NSLog时可以“%d”。

initWithString不一定创建新空间,取决于参数。

(1)如果后边是常量字符串不会创建新空间,NSLog("%d",[str retainCount])时输出为-1,NSlog("%u",[str retainCount])时输出为一串很长的数。

(2)如果是定义新字符串,就会创建新空间。

二、下边是转载的,链接:http://www.cnblogs.com/yjmyzz/archive/2011/02/25/1965338.html

1、initWithFormat是实例方法

只能通过 NSString* str = [[NSString alloc] initWithFormat:@"%@",@"Hello World"] 调用,但是必须手动release来释放内存资源

2、stringWithFormat是类方法

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


另外国外有个贴子对此有专门讨论(http://www.iphonedevsdk.com/forum/iphone-sdk-development/29249-nsstring-initwithformat-vs-stringwithformat.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 做初步的检查.

initWithFormat与initWithString的区别、initWithFormat与stringWithFormat的区别_第1张图片


你可能感兴趣的:(区别,initWithFormat,initWithString)