2011年12月5日, 12:31 上午
之前写过一个NSString的内存管理
不过好像由于之前的理解不深刻,所以写的时候也没有说明太清楚。
CS193P的笔记上有如下实例:
aString = @"I am a string that 2 years old, man!";
这种情况下,字符串储存和管理由系统做,我们不用操心。
aString = [NSString 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的对象,谢谢大家的留言!
2009年06月16日, 3:29 下午
I 要点:
- 如果一个变量在类中被定义为了 IBOutlet 那么你无需对其进行实例化,xib载入器会对其初始化。
- 如果一个变量在类中被定义为了 IBOutlet 那么你必须负责将其释放。xib载入器不会帮忙的… …
*切不要初始化两回,内存会溢出,而且对象锁定也会出错。
2009年06月15日, 5:22 下午
CS193P的笔记上有如下实例:
aString = @"I am a string that 2 years old, man!"; |
这种情况下,字符串储存和管理由系统做,我们不用操心。
aString = [NSString stringWithFormat:@"I am a string that %d years old, man!",2]; |
第二种情况下,我们需要去retain和release这个字符串,系统不管。
2009年06月15日, 5:07 下午
1,你初始化(alloc/init)的对象,你需要释放(release)它。例如:
NSMutableArray aArray = [[NSArray alloc] init]; |
后,需要
2,你retain或copy的,你需要释放它。例如:
后,需要
3,被传递(assign)的对象,你需要斟酌的retain和release。例如:
obj2 = [[obj1 someMethod] autorelease]; |
对象2接收对象1的一个自动释放的值,或传递一个基本数据类型(NSInteger,NSString)时: 你或希望将对象2进行retain,以防止它在被使用之前就被自动释放掉。但是在retain后,一定要在适当的时候进行释放。