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

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

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

转载于:https://www.cnblogs.com/dj3839/p/6798820.html

objective-c高级编程 笔记相关推荐

  1. NDK 高级编程(笔记)

    Android 开发中针对 NDK 的书籍很少,<Pro Android C++ with the NDK>也是出版的比较早的一本书,有些内容可能对现在的开发并不适用.但是书中介绍的内容比 ...

  2. Unix环境高级编程 笔记

    Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...

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

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

  4. UNIX环境高级编程笔记

    1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len);   SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务:   ...

  5. UINX环境高级编程笔记 第3章 文件I/O

    UNIX环境高级编程 第三章 文件I/O 3.1 引言 3.2 文件描述符 3.3 函数open和openat 3.4 函数creat 3.5 函数close 3.6 函数lseek 3.7 函数re ...

  6. Python 高级编程笔记之类别

    目录: 子类化内建类型 访问超类中的方法-super 描述符 & 属性 元编程 主要内容: 1.子类化内建类型 # -*- coding:utf-8 -*-class Folder(list) ...

  7. UNIX环境高级编程笔记(2)- STDIN_FILENO、STDOUT_FILENO和stdin、stdout的区别

    目录 前言 一.STDIN_FILENO.STDOUT_FILENO介绍 二.stdin.stdout介绍 三.代码例程 1.文件描述符的使用 2.流的使用 3.代码标记 总结 前言 本章主要通过UN ...

  8. JS高级编程笔记归总

    1.JS简史 客户端语言--- 为了解决拨号,表单验证缓慢的问题 ECMAScript的新脚本语言的标准. 1.2 JS实现 JS由三部分组成:核心(ECMAScript).文档对象模型(DOM).浏 ...

  9. UNIX环境高级编程笔记之进程控制

    本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序 ...

最新文章

  1. 【小米校招笔试】给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次
  2. 欧拉降幂(Euler_Power_Formula)
  3. 壁纸背景墙/头像/动态壁纸小程序源码-支持用户投稿-带部分采集功能+搭建教程
  4. ShardingSphere(六) 读写分离之mysql 主从同步配置
  5. 经典排序算法 - 希尔排序Shell sort
  6. 卧槽:这款 SQL自动检查神器,吊炸天的功能,真TMD多!!
  7. 微信小程序实战十一:uni中集成ocr身份证识别功能
  8. 失恋33天——我用57天考了一个5A
  9. 7-11 家庭房产 (25 point(s))
  10. python selenium爬虫自动登录实例
  11. 数据结构——什么是数据结构?
  12. 苹果手机软件闪退怎么解决_LOL手游卡顿闪退怎么办-卡顿闪退解决方法解析
  13. window.name属性详解(Javascript)
  14. 如何编写ddos防御脚本
  15. UUI Make StartUp Disk
  16. Centos查看磁盘占用,管理磁盘空间
  17. vscode中嵌入cppcheck进行静态检查,包含插件使用方法
  18. 室内监控摄像机能做什么?安装在室内有哪些好处?
  19. C#_DataTable简介
  20. 【成长经历】【钉钉前端】 高中毕业-如何用 15 年从小白到技术专家

热门文章

  1. 为什么物联网没有杀手级应用
  2. 如何从校招脱颖而出?支付宝程序媛王妍岩:自信+方法
  3. 游戏中的颜色:深度解析游戏设计工具
  4. 英雄联盟手游火线妹上线了!金克丝也想成为第一AD吗?
  5. JavaWeb课程复习资料——用于突击考试总结
  6. 并发编程面试题(2021最新版)
  7. Python基础知识点总结
  8. Vue.js 笔记之 img src
  9. 10如何成为卓越领导者摘录——卓越的领导者
  10. vue骨架屏、时间选择器、轮播图。。你想要的这里全都有