陈斌彬的技术博客

Stay foolish,stay hungry

stringWithFormat 和 initWithFormat 有何不同?

都说Objective-C是一门入门简单,深入难的语言,一直觉得基础不是很牢固,所以这几天也反复在看Objective-C内存管理、ARC相关的东西,下一步准备看看OC的Runtime相关。

NSString

NSString作为Objective-C的最基本的字符串类,从最开始接触iOS开发就用过它,那今天说的NSString中的Format实例化方法,也类似于C语言中的printf中的format格式化。昨天在看《10 iPhone Memory Management Tips》一文的时候看到文中为了提高效率用initWithFormat代替stringWithFormat,今天详细看看这两个方法:

+ stringWithFormat:
– initWithFormat:

一个类方法,一个实例方法,仅仅是用起来可以少些两个字吗?

For Example

下面来个For Example,在非ARC环境下,循环构造10w个NSString,内容一样:

首先是stringWithFormat,占用内存 5.2M

for (int i = 0; i < 100000; i++) {
    [NSString stringWithFormat:@"%d",1234567890];
}

然后加上@autoreleasepool,占用内存 520KB

for (int i = 0; i < 100000; i++) {
    @autoreleasepool {
        [NSString stringWithFormat:@"%d",1234567890];
    }
}

再来试试initWithFormat,占用内存 3.6MB

for (int i = 0; i < 100000; i++) {
    [[NSString alloc] initWithFormat:@"%d",1234567890];
}

再加上autorelease尾巴和autoreleasepool,占用内存 520KB

for (int i = 0; i < 100000; i++) {
    @autoreleasepool {
        [[[NSString alloc] initWithFormat:@"%d",1234567890] autorelease];
    }
}

结论

+ stringWithFormat:

类方法,返回一个autorelease的NSString实例,不用手动Release,在自动释放池中会自动释放。

– initWithFormat:

实例方法,返回一个自己Alloc申请内存的NSString实例,根据OC内存管理黄金法则,管杀管埋,它则需要自己手动Release

因为这两个方法只是在没有使用ARC的时候有所不同,一个需要手动Release一个则是自动进入autoreleasepool,所以在使用ARC的时候他们俩几乎没有什么区别。

Resource Reference