[iOS] 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,今天详细看看这两个方法:

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

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 的时候他们俩几乎没有什么区别。

参考资料:

comments powered by Disqus