iOS 开发 iOS Developer

iOS:ARC内存管理知识总结(一)

2016-04-03  本文已影响232人  ZhengLi

1. ARC的基本概念

/*取得的对象存在,但自己不持有对象*/
       id obj = [NSMutableArray array]//取得非自己生成的对象
       [obj retain]//自己持有对象
id obj = [[obj alloc] init];
      [obj autorealease];
/*取得对象存在,但自己不持有*/
-  objc中,```array```等生成对象但自己不持有的方法内部是通过```autorealease```方法实现的。

2.alloc/retain/release/dealloc方法的实现

struct obj_layout
{
    NSInteger retained;
};
inline id 
NSAllocateObject(Class aClass,NSInteger extraBytes,NSZone *zone){
    int size = 计算容纳对象所需内存大小;
    id new = NSZoneMalloc(zone,size);
    memset (new,0,size);
    new = (id) & ((struct obj_layout *) new)[1];

}

该内存空间内部,也就是对象所处的内存空间内部,头部是struct obj_layout这个结构体,接下来才是对象。alloc方法返回的指针指向的头部以下的内容。也就是除去结构体的内容。

可以通过查看retainCount这个方法的源代码验证以上结论:

- (NSUInteger)retainCout{
    return NSExtraRefcount(self)+1;//需要注意此处的+1,对象内存的头部结构体里的retain其实为0,所以+1。
}

inline NSUInteger 
NSExtraRefcount(id anObject){
    return((struct obj_layout *) anObject)[-1].retained;//此处需要注意-1,因为要访问的实质对象所处内存空间的头部,也就是结构体obj_layout.
}

3.retain,release即delloc方法的实现。

无论是retain还是release,其实内部都是通过操作对象所处内存空间头部的结构体来实现的。

((struct obj_layout *) anObject)[-1].retained++;
- (void)release{
    if(NSDecrementExtraRefCountWasZero(self)){
        [self dealloc];
    }
}
BOOL
NSDecrementExtraRefCountWasZero(id anObject){
    if (obj_layout结构体内部的retained是否为0)
    {
        若为0,返回yes
    }else{
        返回no
    }
}
上一篇下一篇

猜你喜欢

热点阅读