NSString的内存管理 v.2011/12

之前写过一个NSString的内存管理

不过好像由于之前的理解不深刻,所以写的时候也没有说明太清楚。

CS193P的笔记上有如下实例:

aString = @"I am a string that 2 years old, man!";

这种情况下,字符串储存和管理由系统做,我们不用操心。

aString = [ stringWithFormat:@"I am a string that %d years old, man!",2];

第二种情况下,我们需要去retain和release这个字符串,系统不管。

这是之前写的内容。

为什么第一种我们不管这个产生的NSString的retain值呢?是因为其实由于我们建立了一个常量,无论我们retain还是release,对于这个对象都是没有意义的,大家可以尝试

NSString *foo = @"ssff";
[foo release];
[foo release];

会发现,这样的代码并不会让程序崩溃,而且无论你再release几次都是一样的。

第二种其实就是利用NSString 方法来生成一个NSString对象,这个时候我们要招呼到这个对象的retain值,否则就是内存溢出了。而我当时说的并不是一定要releaes或者retain这个stringWithFormat便捷方法产生的对象… 我语文不好,哈哈。便捷方法产生的都是autorelease的对象,谢谢大家的留言!

4 Comments

  1. cocoa 说:

    使用alloc创建的对象才需要release,同时使用retain加强引用,和使用copy深拷贝都是需要release的

    当然如果使用了[[nsobject alloc]autorelease]也是不需要release的

    同时如果对象存储到数组或者字典中,那么对象其实也是被retain过的, 从而防止指针引用的对象被回收, 当它从数组中被移除时, 如果之前没有alloc/retain/copy的话会被立即释放

  2. admin 说:

    感谢您的补充,不过第一句是不是有歧义,alloc后,除非有特殊必要不用再次retain了~

  3. cocoa 说:

    对,一般都不会,retain一般发生在autorelease对象 像stringWithXXX或者 arrayWithXXX
    或者运用在移出数组、字典前
    或者必要的时候

  4. admin 说:

    你不睡啊?还是你也在国外啊?

Leave a Reply