在Objective-C的NSString类中,在获取一个字符串对象的时候,可以使用如下两种方法来完成:

(1)NSString *aString = [NSString alloc]initWithFormat:" number = %d", 100];

(2)NSString *anotherString = [NSString stringWithFormat: " number = %d", 100];

那么,这两种方法有什么区别呢?

  第一种方法是实例方法,内存的分配使用了alloc,因此在不需要该对象的时候,需要使用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 做初步的检查。

参考引用:(1) http://blog.csdn.net/cthawdf/article/details/7550251

   (2) Objective-C基础教程

posted on 2013-01-10 11:40  noname000  阅读(447)  评论(0)    收藏  举报