Cocoa不同内存管理环境下的autorelease
H 混合内存管理环境:垃圾收集法(Garbage Collection)+索引计数法(Reference Counting)
虽然大多数情况下混合环境是不被推荐的,但是如果在这个情况下,autorelease需要注意以下事项:
垃圾收集混合环境下:应该使用drain方法,因为release在GC模式下没有意义
索引计数环境下:drain和release对于autoreleasepool(自动释放池)的效果相同
IPhone, Cocoa, PHP, Javascript, JQuery, Actionscript, etc…
Posts tagged ‘autorelease’
H 混合内存管理环境:垃圾收集法(Garbage Collection)+索引计数法(Reference Counting)
虽然大多数情况下混合环境是不被推荐的,但是如果在这个情况下,autorelease需要注意以下事项:
垃圾收集混合环境下:应该使用drain方法,因为release在GC模式下没有意义
索引计数环境下:drain和release对于autoreleasepool(自动释放池)的效果相同
A Cocoa的内存管理分为 索引计数法(Reference Counting/ Retain Count)和 垃圾收集法(Garbage Collection)。而iPhone上目前只支持前者,所以autorelease就成为很多人的“捷径”。
但是!autorelease其实并不是“自动释放”,不像垃圾收集法,对对象之间的关系侦测后发现垃圾-删除。但是autorelease其实是“延后释放”,在一个运行周期后被标记为autorelease会被释放掉。
切记小心使用autorelease,理解autorelease,防止在你还需要该对象的时候已经被系统释放掉了。
M *retain值 = 索引计数(Reference Counting)
1,你初始化(alloc/init)的对象,你需要释放(release)它。例如:
NSMutableArray aArray = [[NSArray alloc] init];
后,需要
[aArray release];
2,你retain或copy的,你需要释放它。例如:
[aArray retain]
后,需要
[aArray release];
3,被传递(assign)的对象,你需要斟酌的retain和release。例如:
obj2 = [[obj1 someMethod] autorelease];
对象2接收对象1的一个自动释放的值,或传递一个基本数据类型(NSInteger,NSString)时: 你或希望将对象2进行retain,以防止它在被使用之前就被自动释放掉。但是在retain后,一定要在适当的时候进行释放。