MRC下的 initWithFormat: 和 stringWithFormat:

        

        这两个方法是一样的。我们要知道的是怎样去正确的使用他们。 initWithFormat是一个实例方法,它必须被一个新的alloc实例调用,这也意味着你有责任去释放它。stringWithFormat是一个类方法,所以它不适用于任何存在的NSString实例对象(即不能被实例调用)。它所创建和初始化的对象会自动释放(即autorelease)。所以当你使用stringWithFormat时,你不需要去 release它。如果我们能正确使用这两个方法,那他们都不会导致内存泄露,而且两个方法在使用的过程中所占的内存也使相同的。


        在网上看到一个出现 内存泄露的案例,如下:

	label.text = [NSString alloc] initWithFormat:@"%@", otherString];

        在MRC的管理方式下,这里会导致内存泄露。原因是:在 label 被释放并调用 dealloc后,虽然是调用一次内部 [_text release], 但是我们发现,在上面代码中 [NSString alloc]使引用计数为1, 而在给lable的text属性赋值时,label.text 实际上是调用了 text 的 setter 方法,使得引用计数增1, 这时引用计数为2,当 label 调用了 dealloc 时,只释放了一次 text ,最终导致内存泄露。解决这个问题有两种方法。如下:

方法一:

NSString *string = [[NSString alloc] initWithFormat:@"%@", otherString];
label.text = string;
[string release];

        这样,我们事先 release 一次,当label销毁时会自动销毁text。

        另一种简单的方法是直接使用类方法,如下:

label.text = [NSString stringWithFormat:@"%@", otherString];
        这样,在 label 销毁前,会自动将 text autorelease。不过我们还是尽量少用autorelease对象。为什么要尽量少用呢?虽然autorelease对象简单又实用,但是在开发 App 的过程中我们应该小心的使用它。当你创建一个project()的后,在main函数中会自动创建一个autoreleasepool ,但是这个 autoreleasepool 在你程序结束前是不会进行清理的。这就意味着在你的程序还在运行时,这个autorelese 的对象实际上内存是泄露的,因为在程序退出之前他们但是一直保留的。所以能用手动管理尽量手动管理,不要贪图方便。(当然,也可以自己在程序内部创建autoreleasepoll 来管理内存)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值