内存管理与自动引用计数—第二日

1.2.5 autorelease

本节作者引出一个观点:autoreleasePool相当于C语言中的局部变量,当作用域结束的时候废弃(并释放池内的所有对象)

NSAutoreleasePool的调用:

创建并持有pool

调用已分配的对象的autorelease方法

释放pool

1.2.6 & 1.2.7 GNU&苹果的实现

-  (id)autorelease {

[NSAutoreleasePool addobject:self];

}

+ (void)addObject:(id)anyObject {

NSAutoreleasePool *pool = [获取当前的pool];

}

获取当前的pool一般为最内侧的pool,例如:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init];

NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc] init];

NSObject *obj = [[NSObject alloc] init];

[obj autorelease]

此时获取的为pool2。

个人感觉有点像大括号(手动滑稽)。

GNUstep的autoreleasePool使用连续表实现的,如果对象调用autorelease方法,那么这个对象将会追加到pool对象的数组里。

苹果的实现

太长,不想看。。。嗯,看不大明白。。。

内存管理与自动引用计数—第二日_第1张图片
内存管理与自动引用计数—第二日_第2张图片
内存管理与自动引用计数—第二日_第3张图片

可以通过NSAutoreleasePool的调试用非公开类方法showPools来确认已被autorelease的对象方法。showPools方法会将当前的pool的状况输入到控制台。

1.2 完

你可能感兴趣的:(内存管理与自动引用计数—第二日)