APP内存管理

打印 上一主题 下一主题

主题 795|帖子 795|积分 2389

文章目录



1、iOS程序的内存布局


   1、代码段:编译之后的代码
2、数据段
     2.1、字符串常量:比如NSString *str = @“123”
2.2、已初始化数据:已初始化的全局变量、静态变量等
2.3、未初始化数据:未初始化的全局变量、静态变量等
    3、:通过alloc、malloc、calloc等动态分配的空间,分配的内存空间地址越来越大
4、:函数调用开销,比如局部变量。分配的内存空间地址越来越小
  2、Tagged Pointer 标记指针

   1、从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储.
2、在没有使用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值。使用Tagged Pointer之后,NSNumber指针里面存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中。(Tagged Pointer指针的值不再是地址了,而是真正的值。所以,实际上它不再是一个对象了,它只是一个披着对象皮的普通变量而已。所以,它的内存并不存储在堆中,也不需要 malloc 和 free。)
3、当指针不够存储数据时,才会使用动态分配内存的方式来存储数据。
4、objc_msgSend能识别Tagged Pointer,比如NSNumber的intValue方法,直接从指针提取数据,节省了以前的调用开销。
5、在内存读取上有着 3 倍的效率,创建时比以前快 106 倍。
  优点:
1、减少了 64 位机器下程序的内存占用,还提高了运行效率。完美地解决了小内存对象在存储和访问效率上的问题。
弊病:
1、因为并不是真正的对象,而是一个伪对象,是没有isa指针的。
2、因为不是真正的对象,所以如果你直接访问Tagged Pointer的isa成员的话,在编译时将会得到警告。这时我们只要避免在代码中直接访问对象的 isa 变量,即可避免这个问题。
判断是否为Tagged Pointer:
   1、iOS平台,最高有效位是1(第64bit)
2、Mac平台,最低有效位是1
  [code]#if TARGET_OS_OSX & __x86_64__    //64-bit Mac tag bit is LSB#   define OBJC_MSB_TAGGED_POINTERS 0#else    //Everything else tag bit is MSB#   define OBJC_MSB_TAGGED_POINTERS 1#endif#if OBJC_MSB_TAGGED_POINTERS#   define _OBJC_TAG_MASK (1UL

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表