在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
今天在看书上的一段代码时,发现NSString实例化时,有时用的是initWithFormat方法,有时用的是stringWithFormat,到底应该如何选择呢? 区别: 1、initWithFormat是实例方法 只能通过 NSString* str = [[NSString alloc] initWithFormat:@"%@",@"Hello World"] 调用,但是必须手动release来释放内存资源 2、stringWithFormat是类方法 可以直接用 NSString* str = [NSString stringWithFormat:@"%@",@"Hello World"] 调用,内存管理上是autorelease的,不用手动显式release
而且提出了一个常见错误: 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 做初步的检查. 作者:菩提树下的杨过
出处:http://www.cnblogs.com/yjmyzz/archive/2011/02/25/1965338.html 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |
请发表评论