Life Before Automatic Reference Counting <一>

Pro Multithreading and Memory Management for iOS and OS X: with ARC,Grand Central Dispatch,and Blocks   读书。

Life Before Automatic Reference Counting

MRC---------《1》array没有拥有权,必须retain之后才有,才有拥有权,才能去释放。

Life Before Automatic Reference Counting <一>_第1张图片
1-1

               ---《2》allocObject 如果以alloc开头就是这个方法有了拥有权。调用改方法,对象也具有拥有权。

Life Before Automatic Reference Counting <一>_第2张图片
1-2

------《3》[NSMutableArray   array]  在方法里面autorelese 用释放池自动释放。所以调用它时候没有拥有权更不能release.     

Life Before Automatic Reference Counting <一>_第3张图片
1-3


Life Before Automatic Reference Counting <一>_第4张图片
1-3-1

----《4》没有拥有权不可以release,否则会崩掉。

有拥有权就可以release,如果多release 会及时或者稍候崩掉,crash。

Life Before Automatic Reference Counting <一>_第5张图片
1-4

GNUstep implementation.---------------------Implementing alloc, retain, release, and dealloc  

GNUstep《1》查看gnustep的nsobject的源码发现。alloc的创建。

Life Before Automatic Reference Counting <一>_第6张图片
1-1

创建 ~1个size大小的空间。size包括结构体的大小+实列化大小 

用0填充 函数返回一个指向分配起始地址的指针分配的size是以struct_layout起始的,向后移动一位的指针返回,id类型。The alloc method returns a memory block filled with zero containing a struct obj_layoutheader, which has a variable “retained” to store the number of references. This number

is called the reference count. Figure 1–8 shows the structure of an object in the

---------------- >-----(alloc方法返回用0填充的内存块,这个内存块的头是一个obj_layout结构体,结构体)里面包含一个变量  ‘retained’来存储引用计数的。调用obj.retainCount]就是调用这个值。

alloc 被调用之后引用系数+1.

GNUstep <2>retain method  返回结构体中的变量 retained  retaiCount 结构体中retained值+1.

Life Before Automatic Reference Counting <一>_第7张图片
GNUstep2-1
Life Before Automatic Reference Counting <一>_第8张图片
GNUstep2-2


 GNUstep <3>release method      release使结构体中的变量值减少,当变量值为0的时候就会dealloc掉(self)该对象 ,free(p) 释放该对象。

Life Before Automatic Reference Counting <一>_第9张图片
GNUstep3-1




GNUstep <4>dealloc method

Life Before Automatic Reference Counting <一>_第10张图片
GNUstep4-0


---------Apple’s Implementation of alloc, retain, release, and dealloc

CF/CFRuntime.c __CFDoExternRefOperation  

Apple’s《1》--------runtime.m    采用散列表(引用计数表) 表键值为内存块。

Life Before Automatic Reference Counting <一>_第11张图片
苹果
Life Before Automatic Reference Counting <一>_第12张图片
苹果

GNU《2》-------------Autorelease 

Life Before Automatic Reference Counting <一>_第13张图片
GUN2-1
Life Before Automatic Reference Counting <一>_第14张图片
GUN2-2

apple《2》-------------Autorelease

每个线程(包括主线程),都维护了一个管理 NSAutoreleasePool 的栈。当创先新的 Pool 时,他们会被添加到栈顶。当 Pool 被销毁时,他们会被从栈中移除。

autorelease 的对象会被添加到当前线程的栈顶的 Pool 中。当 Pool 被销毁,其中的对象也会被释放。

当线程结束时,所有的 Pool 被销毁释放。

Life Before Automatic Reference Counting <一>_第15张图片
apple2

AutoreleasePoolPage 对象存储除了上面的实例变量所占空间autorelease对象的地址  next 指针指向下一个 add 进来的 autorelease 的对象即将存放的位置thread 指针指向当前线程。AutoreleasePoolPage 以双向链表的形式组合而成(分别对应结构中的 parent 指针和 child 指针)一个 Page 的空间被占满时,会新建一个 AutoreleasePoolPage 对象,连接链表。

Life Before Automatic Reference Counting <一>_第16张图片

-[NSAutoreleasePool retain]: Cannot retain an autorelease pool'   autoreleasePool自动释放池不能被 retain只有一个对象指向它的地址

*** -[NSAutoreleasePool drain]: This pool has already been drained, do not release it (double release).提示,做了特别处理。[pool0drain];之后不需要再被release了。 drain里面做了处理。

参考https://github.com/opensource-apple

http://svn.gna.org/svn/gnustep/libs/base/branches/dawn/Source/NSObject.m 

参考 GNUstep/modules/core/base/Source/NSObject.m alloc

你可能感兴趣的:(Life Before Automatic Reference Counting <一>)