iOS: NSString应该用initWithFormat? 还是 stringWithFormat?

zz/2024/6/13 21:36:02

注意:对于iOS 5的ARC特性来说,两个方法是等价的,不会有memory leak的问题!(ref link: http://stackoverflow.com/questions/7960912/stringwithformat-vs-initwithformat-under-arc)


下面文字的参看文档:

http://www.cnblogs.com/yjmyzz/archive/2011/02/25/1965338.html

http://www.iphonedevsdk.com/forum/iphone-sdk-development/29249-nsstring-initwithformat-vs-stringwithformat.html



今天在看书上的一段代码时,发现NSString实例化时,有时用的是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/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




http://www.ngui.cc/zz/2731648.html

相关文章

iOS: Some issues about push notification

custom data in push notification http://no001.blog.51cto.com/1142339/642817 当运行带apns feature的app到真机上后,会弹出错误: "Error DomainNSCocoaErrorDomain Code3000 "no valid aps-environment entitlement string found for a…

iOS: #define

typedef与#define的区别。 http://www.sf.org.cn/article/base/200608/18988.html #define 是宏定义,所谓的宏定义,就是将某段代码、地址、字符串等一串的文字,用一个宏来代替。#define是一种预处理。 #define与typedef功能类似&#xff0…

Raphael无法处理event的问题!!!

当你用下列代码画一个矩形,然后click it,照例应该会popup alert var paper Raphael("canvas", 600, 480); var rect paper.rect(10, 40, 50, 50); rect.click(function () {alert(hello); }); 但实际上并不会popup alert,是…

iOS: NSUserDefaults issues

NSUserDefaults用于存储一些app setting。当你关闭app之后再打开后,之前存储的setting依然可以从NSUserDefaults里读取。注意:密码最好不要存储在NSUserDefaults里,要存储也必须用AES/DES加密存储,更安全的方法是 https://github.…

Hibernate: cannot simultaneously fetch multiple bags 问题的解决办法

如果在一个pojo里使用超过一个List的变量,则会出现这个错误 详见: http://www.quanlei.com/2011/10/2817.html 他提供了4个解决方法,我采用方案3: 改变FetchMode为Fetch(FetchMode.SUBSELECT) 其他参考links: http://www.mkyong.…

iOS: UI 开发

中文 http://blog.csdn.net/column/details/zhf156.html Table View http://www.raywenderlich.com/312/beautiful-table-view-helper-class http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html http://cocoawithlove.com/2010/12/uitableview-co…

iOS: login window design

QuickDialog https://github.com/escoz/QuickDialog QQ登录界面demo http://www.cocoachina.com/bbs/read.php?tid69074&page1 Login interface design http://www.photoshop-plus.co.uk/2012/04/13/clean-mobile-login-screen-tutorial/ iPhone Modal View Smalle…

iOS: Classes for fetching and parsing XML or JSON via HTTP

http://cocoawithlove.com/2011/05/classes-for-fetching-and-parsing-xml-or.html

iOS: 2 Xib's with the same File's Owner for 1 IBOutlet object?

http://stackoverflow.com/questions/8978654/2-xibs-with-the-same-files-owner-for-1-iboutlet-object 若2个xib的file owner都指向同一个view controller,那么在2个xib不会同时被load的情况下,分别在不同xib上的控件可以指向view controller里的同一个…

Android: google play graphic assets guide

http://support.google.com/googleplay/android-developer/bin/answer.py?hlen&answer1078870