ARC 之内存转换

时间:2023-02-05 03:07:16

ARC 之内存转换


技术博客http://www.cnblogs.com/ChenYilong/ 
新浪微博http://weibo.com/luohanchenyilong 
ARC 之内存转换
ARC 之内存转换
ARC 之内存转换
ARC 之内存转换
ARC 之内存转换
ARC 之内存转换
ARC 之内存转换
ARC 之内存转换
ARC 之内存转换
ARC 之内存转换
ARC 之内存转换
 

ARC 之内存转换
ARC 之内存转换 
技术博客http://www.cnblogs.com/ChenYilong/新浪微博http://weibo.com/luohanchenyilong


ARC 之内存转换 ARC 之内存转换

Foundation对象&CoreFoundation对象 
• 在iOS世界,主要有两种对象: - Objective-C 对象- Core Foundation 对象
• Core Foundation对象主要是有C语言实现的Core Foundation Framework 的对象,其中也有对象引用计数的概念,只是不是 Cocoa Framework的 retain/release,而是自身的CFRetain/ CFRelease 接口
ARC 之内存转换
项目的ARC&MRC之间的转换
ARC 之内存转换ARC 之内存转换
ARC代码 
id obj = [[NSObject alloc] init];! void *p = obj;!
obj = p;!
[obj release];!
!

ARC 之内存转换

ARC代码 
id obj = [[NSObject alloc] init];!void *p = (__bridge void *)(obj);! obj = (__bridge id)(p);!
• 使用 __bridge 关键字可以实现id类型与void*类型 的相互转换
ARC 之内存转换

__bridge_retain 
• __bridge_retain关键字表示类型被转换时,其对象
的所有权也将被变换后变量所持有• MRC代码如下:
id obj = [[NSObject alloc] init];
void *p = obj; [(id)p retain]; 
ARC 之内存转换

__bridge_retain测试程序
void *p = 0;
{
Person *obj = [[Person alloc] init];obj.name = @"liufan";
p = (__bridge void *)obj;
}
Person *tmp = (__bridge Person *)p;
NSLog(@"class=%@ %p %@", [(__bridge Person *)p class], p,tmp.name); 

ARC 之内存转换


__bridge_transfer 
• 当想把本来拥有对象所有权的变量,在类型转换 后,让其释放原先所有权的时候,需要使用__bridge_transfer 关键字 
• MRC代码如下 
id obj = (id)p; [obj retain]; [(id)p release];

ARC 之内存转换

小结 
• __bridge_retained 是编译器替我们做了retain操作 
• __bridge_transfer 是编译器替我们做了release操作 
• __bridge 只是单纯地执行了类型转换,没有进行所有权的转移 
• 注意:如果转换的是CFArrayRef,仍然需要手动释放内存 
• 辅助解决方法:CMD+SHIFT+B 

ARC 之内存转换

自动释放池 
• 在程序运行时,当自动释放池被耗尽或者取消分 配时,会向所有调用autorelease的自动释放对象 发送一个release消息

ARC 之内存转换

提示 
• 将对象添加到数组和集合中时,引用计数会自动 加1,当从数组和集合中删除该对象时,引用计数 会自动减1 
ARC 之内存转换
© chenyilong. Powered by Postach.io

ARC 之内存转换的更多相关文章

  1. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

  2. ARC下内存泄露问题

    ARC下内存泄露问题 ARC下内存泄露问题,有需要的朋友可以参考下. iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露. 下 ...

  3. 八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习

    1.autorelease的用法   1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用auto ...

  4. iOS- 如何将非ARC的项目转换成ARC项目(实战)

    1.前言   因为公司有个国外餐饮系统,编程开发了3-4年,之前用的都是非ARC,开发到今年,第一批迭代开发的人员早已不见,目前发现了有许多的内存泄露之类的,系统没有自动释放该释放的内存.一旦app长 ...

  5. iOS通过ARC管理内存(内容根据iOS编程编写)

    栈 当程序执行某个方法(或函数)时,会从内存中一个叫栈的区域分配一块内存空间,这块内存空间我们叫帧.帧负责保护程序在方法内声明的变量的值.在方法内声明的变量我们称之为局部变量. 当我们的程序开始启动, ...

  6. iOS 下ARC的内存管理机制

    本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...

  7. arc下内存泄漏的解决小技巧

    一定要注意,我们运行app时,一定要关心内存的使用,尽量不要超过20M,即使有很多图片要显示也绝对不能超过30M.所以运行自己开发的app时多关心内存的使用是个很好的习惯. 对于性能,内存的优化,这个 ...

  8. ARC的内存管理

        在objective-c中,内存的引用计数一直是一个让人比较头疼的问题.尤其是当引用计数涉及到arc.blocks等等的时候.似乎ARC的出现只是让我们解放了双手,由于底层实现依然依赖引用计数 ...

  9. iOS 非ARC基本内存管理系列总结6 -设计微博模型

    设计简单的微博模型:用User类和Status类来模拟实现 在非ARC机制下有两种方式,两者没有太大的区别之所以写了两种只是为了方便学习和对比两种写法! 第一种:没有使用atuorelease和自动释 ...

随机推荐

  1. 如何使用grunt压缩js文件

    jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过 ...

  2. 提高SQL的查询效率

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引.   2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使 ...

  3. Ubuntu环境下手动配置zookeeper

    配置zookeeper 注意:因为是单机伪分布式配置,故同一机器上有3个server zookeeper文件格式如下 home---zookeeper---server0---zookeeper | ...

  4. RedHat Enterprise Linux 6.3 安装Oracle Database 11g

    按照以下文章正确将oracle安装在linux上 http://yiyiboy2010.iteye.com/blog/1670795 http://mirrors.163.com/centos/6.5 ...

  5. CASE WHEN 及 SELECT CASE WHEN的用法(转)

    Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END   ...

  6. css3制作网页中常见的小箭头

    /* css3三角形(向上 ▲) */ div.arrow-up { width:0px; height:0px; border-left:5px solid transparent;  /* 右透明 ...

  7. c++字符串string的操作

    #include <iostream> #include <cstring> #include <string> using namespace std; int ...

  8. NodeJS中的require和import

    ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...

  9. Android动画之逐帧动画&lpar;FrameAnimation&rpar;详解

    今天我们就来学习逐帧动画,废话少说直接上效果图如下: 帧动画的实现方式有两种: 一.在res/drawable文件夹下新建animation-list的XML实现帧动画 1.首先在res/drawab ...

  10. MySQL 常用使用语句

    1)批量删除表 Select CONCAT( 'drop table ', table_name, ';' ) FROM information_schema.tables Where table_n ...