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

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

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. Install Windows 2016 on VirtualBox

    Download ISO file for Windows 2016 (180 days free).  https://www.microsoft.com/en-us/evalcenter/eval ...

  2. OutOfMemoryError/OOM/内存溢出异常实例分析--堆内存溢出

    Java堆内存溢出 只要不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象, 那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常,代码如下: import ...

  3. How to resolve CSRF protection error while adding service through Ambari api

    Short Description: This article will describe on how to disable CSRF protection in Ambari. Article A ...

  4. LOJ #6052. 「雅礼集训 2017 Day11」DIV

    完了我是数学姿势越来越弱了,感觉这种CXRdalao秒掉的题我都要做好久 一些前置推导 首先我们很容易得出\((a+bi)(c+di)=k \Leftrightarrow ac-bd=k,ad+bc= ...

  5. 二、使用docker-compose搭建AspNetCore开发环境

    1 使用docker-compose搭建开发环境 我们的目标很简单:使用docker-compose把若干个docker容器组合起来就成了. 首先使用Nginx代理所有的Web程序,这样只需要在主机上 ...

  6. 主机与虚拟机都可以上网,但是互相ping不通

    问题:主机与虚拟机都可以上网,但是互相ping不通  可能:相关入站规则没有启用  解决:第4步双击后,打勾设置“已启用” 

  7. Java数据结构和算法 - 堆

    堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...

  8. win10激活(免费+永久)视频教程

    U盘重装Win10系统视频教程 好久不见,不知同学们有没有想我~ 最近因为工作太忙所以好久都没有写文章了,很多朋友希望我推一期win10激活教程,所以今天带三胖打完针后,开始写一期win10激活教程: ...

  9. nginx 报错502Bad Gateway

    场景: 目前在ECS中起了多个node服务,使用forever进程守护,最近,打开线上页面发现报错502 Bad Gateway;同时部分静态资源访问不到.(之前可以的): 解决: 首先查看nginx ...

  10. Python:游戏:扫雷(附源码)

    这次我们基于 pygame 来做一个扫雷,上次有园友问我代码的 python 版本,我说明一下,我所有的代码都是基于 python 3.6 的. 先看截图,仿照 XP 上的扫雷做的,感觉 XP 上的样 ...