objective-C: NSString应该用initWithFormat? 还是 stringWithFormat?

今天在看书上的一段代码时,发现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

最后,如果你不确定你的代码是否有内存泄漏问题,可以用Xcode中的Build-->Build And Analyze 做初步的检查.

时间: 2024-09-20 23:10:35

objective-C: NSString应该用initWithFormat? 还是 stringWithFormat?的相关文章

initWithFormat 和stringWithFormat的区别

差别: 1.initWithFormat是实例办法 只能经由过程 NSString* str = [[NSString alloc] initWithFormat:@"%@",@"Hello World"] 调用,然则必须手动release来开释内存资料 2.stringWithFormat是类办法 可以直接用 NSString* str = [NSString stringWithFormat:@"%@",@"Hello World&

Objective-C中字符串NSString的常用操作方法总结_IOS

1.创建字符串 (1)常量字符串 复制代码 代码如下: NSString *string = @"i am an iOSDevTip!"; (2)常用创建方法 复制代码 代码如下: NSString *string = [[NSString alloc] init]; string = @"i am an iOSDevTip too!"; (3)用initWithString创建字符串 复制代码 代码如下: NSString *string = [[NSString

OC之NSString/NSMutableString

NSString 不可变字符串 NSMutableString 可变字符串 定义: NSString *str = [[NSString alloc] init]; NSString *str = [[[NSString alloc] init] autorelease];   注意:在NSString 中存在自己的实例化和初始化的方法 例如: NSString *str1 = [NSString stringWithCString:"new String" enconding: NS

iOS 打开系统相册和使用相机

使用相机  添加系统相册照片 ViewController.h 代码: <code class="hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-si

给一个金额字符串插入逗号分隔 保留两位有效数字

格式:###,###.## * * @param number 金额字符串 * * @return */ - (NSString*) formatAmount:(NSString*)number { NSMutableString *resultStr = [NSMutableString stringWithFormat:@"%.2f",[number doubleValue]]; BOOL bellowZearo = NO; if ([number doubleValue]<

retaincount-它们的计数 retainCount 有什么不同?

问题描述 它们的计数 retainCount 有什么不同? initWithString 和 initWithFormat 及StringWithFormat 的区别? 它们的计数 retainCount 有什么不同? 解决方案 http://blog.sina.com.cn/s/blog_69081e060100utgt.html

贴点国外大神代码,没事瞅瞅

// 运行时,这整的 void SwizzleClassMethod(Class c,SEL orig, SEL new) {     Method origMethod =class_getClassMethod(c, orig);     Method newMethod =class_getClassMethod(c, new);          c = object_getClass((id)c);          if(class_addMethod(c, orig,method_

替换NSString类中的stringWithFormat:方法

替换NSString类中的stringWithFormat:方法 先给出源码: YXUseful.h // // YXUseful.h // NSString // // Copyright (c) 2014年 Y.X. All rights reserved. // #import <Foundation/Foundation.h> NSString * String(NSString *format, ...); YXUseful.m // // YXUseful.m // NSStrin

objective c-转换NSString到Int类型

问题描述 转换NSString到Int类型 转换NSString到Int类型,得到dpPoint:0.而我需要的结果是dpPoint:2. dpPointStr = [NSString stringWithFormat:@""%@""[verifyRow valueForKey:@""default_point""]];NSLog(@""dpPointStr:%@""dpPointStr