• 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 做初步的检查.

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    B
    R
    C
    B
    异步解决方案----Promise与Await
    NPM 与 Nodejs
    借助node.js + mysql 学习基础ajax~
    bind、call、apply的区别与实现原理
    私有 npm 仓库的搭建
    学习 Promise,掌握未来世界 JS 异步编程基础
  • 原文地址:https://www.cnblogs.com/songfeixiang/p/3733707.html
Copyright © 2020-2023  润新知