引用计数:通过给对象计数标志,来判断是否释放对象

注:只能释放自己持有的对象

id obj = [NSMutableArray array]

如obj这个对象,并不是你所持有的对象,所以你无法进行释放

但是你可以通过retain来持有这个对象

[obj retain]
[obj release]

什么样的对象不是你所持有的,比如你调用了

[obj autorelease]

使用autorelease会让你的对象注册到autoreleasepool中,在pool结束时,自动调用release

现在说说计数

通过alloc或者retain,都能让这个对象的引用计数加一

调用release后,引用计数减一

每次调用release,都会对引用计数进行判断,若减一后引用计数为0

则会调用dealloc废弃对象

[self dealloc]

在ios中,苹果通过散列表(哈希表)管理引用计数

autorelease的使用

//未使用ARC
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id obj = [[NSObject alloc] init];
[obj autorelease];
[pool drain]; //使用ARC
@autoreleasepool {
id __autoreleasing obj = [[NSObject alloc] init];
}

__strong

表示对对象的强引用

{
id __strong obj = [[NSObject alloc] init];
//等同于 id obj = [[NSObject alloc] init];
//obj为强引用,自己持有对象
}
//obj超出其作用域,强引用失效,自动释放自己持有的对象,对象的所有者不在,废弃该对象

在强引用中,可能造成互相强引用和对自身的强引用,造成内存的泄露

//这里写个对自身的强引用
{
id test = [[Test alloc] init];
//Test 为自己定义的一个类
[test setObejct:test];
//setObejct 是Test中的一个方法,给属性obj(id __strong obj)赋值
}
//超出作用域,test被释放
//但test里的属性obj被赋值为test,test被释放,里面的属性也要被释放因此test被再次释放,因此发生了内存的泄露

这时就需要弱引用

__weak

表示对对象的弱引用,弱引用不能持有对象的实例

id __weak obj = [[NSObject alloc] init];
//这类在编译器中都会报错,因为弱引用无法持有对象,生成的对象会立即被释放,也就是对象的引用计数并未增加,还是0
id __strong obj1 = [[NSObject alloc] init];
id __weak obj2 = obj1;
//这个就没问题了,对象被obj1引用,并没有立即释放

所以刚刚的问题,只要将刚刚的Test类的属性设为id __weak obj就行了

ARC的规则

第一、不能使用retain/release/retainCount/autorelease
使用ARC,内存管理由编译器来负责,无需写上面关键词
第二、在ARC环境下,使用alloc/new/copy/mutableCopy来生成/持有对象
copy/mutableCopy的使用需要copyWithZone的支持,如果没有,则不支持copy/mutableCopy
第三、不能显示调用 dealloc
第四、使用@autoreleasepool块来替代NSAutorealeasePool
第五、不能使用区域NSZone
第六、对象变量不能作为C语言结构体的成员
第七、显示转换id和void *
第七、不能使用NSAllocateObject/NSDeallocateObject

关于显示转为id和void *,要知道core foundation h和bridge方面的知识

参考博客http://blog.csdn.net/annkey123/article/details/8271867

也就是core foundation其实是用c写的,提供底层的接口,为什么需要它呢,因为这样可以让各种不同的框架联系起来

这里有个关于这方面的历史http://www.udpwork.com/item/10889.html

id obj; 等于 id __strong obk;

id *obj; 等于 id __autoreleasing *obj;

所以在声明一个强引用的数组时,需要这样定义 id __strong *array


保留。。。。。一脸懵逼


多线程:http://www.jianshu.com/p/2d57c72016c6

还有个信号量:http://www.jianshu.com/p/c5a4a3fce93d

objective-c高级编程 笔记的更多相关文章

  1. Android高级编程笔记(四)深入探讨Activity(转)

    在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...

  2. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

  3. javascript高级编程笔记01(基本概念)

    1.在html中使用JavaScript 1.  <script> 元素 <script>定义了下列6个属性: async:可选,异步下载外部脚本文件. charset:可选, ...

  4. C#高级编程笔记之第三章:对象和类型

    类和结构的区别 类成员 匿名类型 结构 弱引用 部分类 Object类,其他类都从该类派生而来 扩展方法 3.2 类和结构 类与结构的区别是它们在内存中的存储方式.访问方式(类似存储在堆上的引用类型, ...

  5. C#高级编程笔记之第二章:核心C#

    变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...

  6. C#高级编程笔记 (6至10章节)运算符/委托/字符/正则/集合

    数学的复习,4^-2即是1/4/4的意思, 4^2是1*2*2的意思,而10^-2为0.01! 7.2运算符 符号 说明 例   ++ 操作数加1 int i=3; j=i++; 运算后i的值为4,j ...

  7. UNIX环境高级编程笔记 目录

    每一章的重点会使用加粗字体 第一章:UNIX基础知识:UNIX体系结构:文件和目录:输入和输出:程序和进程:出错处理:信号:时间值:系统调用和库函数 第三章:文件I/O:文件描述符:文件操作函数:文件 ...

  8. C#高级编程笔记2016年10月12日 运算符重载

    1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...

  9. C#高级编程笔记 Day 7, 2016年9月 19日 (泛型)

    1.协变和抗变 泛型接口的协变 如果泛型类型用 out  关键字标注,泛型接口就是协变的.这也意味着返回类型只能是 T. 接口IIndex 与类型T 是协变的,并从一个制度索引器中返回这个类型. pu ...

  10. UNIX环境高级编程笔记之高级I/O

    本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 readv和writev函数,以及存储映射I/O ...

随机推荐

  1. SQL Server 数据库基于备份文件的【一键还原】

    1. 备份与还原的基础说明 我们知道在DBA的日常工作中,SQL Server 数据库的恢复请求偶有发生,可能是用作数据的追踪,可也可能能是数据库的灾难恢复. 数据库常用的备份命令如下: ----完整 ...

  2. SqlServer中用SQL语句附加数据库及修改数据库逻辑文件名

    --查询数据库逻辑文件名 USE 数据库名 SELECT FILE_NAME(1) --查询数据库逻辑文件名(日志) USE 数据库名 SELECT FILE_NAME(2) --附加数据库 sp_a ...

  3. javascript权威指南笔记[6-8]

    1.三类对象,两类属性 2.原型链只有在查询的时候才会体现 3.对象属性访问 4.属性赋值 5.delete只是断开属性和宿主对象的关系,不会去操作属性中的属性 6.Object.ke() var m ...

  4. [JLOI2016] 成绩比较

    推石子 首先设\(d[i]=\sum_{t=1}^{U[i]}t^{n-R[i]}(U[i]-t)^{R[i]-1}\),即第\(i\)门课程分数的合法分布方案数: 然后设\(f[i,j]\)表示前\ ...

  5. request.getContextPath()

    今天终于明白了jsp中的request.getContextPath()是怎么回事了. request.getContextPath()  返回站点的根目录 request.getRealpath(& ...

  6. Tomcat的测试网页换成自己项目首页

    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDepl ...

  7. .NET Core微服务之基于Steeltoe使用Zipkin实现分布式追踪

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 =>  Steeltoe目录快速导航: 1. 基于Steeltoe使用Spring Cloud Eureka 2. 基于Steelt ...

  8. 什么是Servlet(原理,从访问到方法)

    Servlet简介 Servlet是SUN公司提供的一门用于开发动态WEB资源的技术.SUN公司在其API中提供了一个Servlet接口,用户若想开发一个动态WEB资源(即开发一个Java程序向浏览器 ...

  9. Python爬虫实例:爬取猫眼电影——破解字体反爬

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  10. shared_ptr和动态数组

    std::shared_ptr智能指针是c++11一个相当重要的特性,可以极大地将开发者从资源申请/释放的繁重劳动中解放出来. 然而直到c++17前std::shared_ptr都有一个严重的限制,那 ...