zoukankan      html  css  js  c++  java
  • OC_自动引用计数器_0x02

    0x01.alloc/retain/release/dealloc实现

    alloc:

    struct obj_layout {

      NSUInteger retained;

    };

    + (id)alloc

    {

      int size = sizeof(struct obj_layout) + 对象大小;

      struct obj_layout *p = (struct obj_layout *)calloc(1, size);

      return (id)(p+1);

    )

      alloc类方法用struct obj_layout中的retained整数来保存引用计数,并将其写入对象内存头部,该对象内存块全部置0后返回。

      执行alloc后对象的retainCount是“1”,下面通过GNUstep的源代码来确认:

      -(NSUInteger)retainCount

      {

        return NSExtraRefCount(self) + 1;

      }

      inline NSUInteger

      NSExtraRefCount(id anObject)

      {

        return ((struct obj_layout *) anObject)[-1].retained;

      }

      由对象寻址找到对象内存头部,从而访问其中的retained变量。因为分配时全部置0,所以retained为0.由NSExtraRefCount(self) + 1得出,retainCount为1可以推测出,retain方法使retained变量加1,

      而release方法使retained变量减1.

      下面来看一下调用出的retain实例方法。

      -(id)retain

      {

        NSIncrementExtraRefCount(self);

        return self;

      }

      inline void

      NSIncrementExtraRefCount(id anObject)

      {

        if(((struct obj_layout *)anObject [-1].retained == UINT_MAX -1)

        {

          [NSException raise:NSInternalInconsistencyException format:@"NSIncrementExtraRefCount() asked to increment too far");

        }

        ((struct obj_layout *)anObject)[-1].retained++;

      }

      

  • 相关阅读:
    墨西哥选美皇后涉毒被捕 丢失桂冠
    html中的超连接和鼠标事件
    用SSL安全协议实现WEB服务器的安全性
    PHP中的一些经验积累 一些小巧实用的函数
    博客特效之背景动画雨滴(转帖)
    smarty中section的使用
    程序员语录
    css常用属性
    10年软件开发教会我最重要的10件事[转]
    WP7中对ListBox的ItemTemplate中子元素的后台操作
  • 原文地址:https://www.cnblogs.com/fkunlam/p/4903672.html
Copyright © 2011-2022 走看看