objective-c高级编程 笔记
引用计数:通过给对象计数标志,来判断是否释放对象
注:只能释放自己持有的对象
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高级编程 笔记的更多相关文章
- Android高级编程笔记(四)深入探讨Activity(转)
在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...
- UNIX环境高级编程笔记之文件I/O
一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...
- javascript高级编程笔记01(基本概念)
1.在html中使用JavaScript 1. <script> 元素 <script>定义了下列6个属性: async:可选,异步下载外部脚本文件. charset:可选, ...
- C#高级编程笔记之第三章:对象和类型
类和结构的区别 类成员 匿名类型 结构 弱引用 部分类 Object类,其他类都从该类派生而来 扩展方法 3.2 类和结构 类与结构的区别是它们在内存中的存储方式.访问方式(类似存储在堆上的引用类型, ...
- C#高级编程笔记之第二章:核心C#
变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...
- 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 ...
- UNIX环境高级编程笔记 目录
每一章的重点会使用加粗字体 第一章:UNIX基础知识:UNIX体系结构:文件和目录:输入和输出:程序和进程:出错处理:信号:时间值:系统调用和库函数 第三章:文件I/O:文件描述符:文件操作函数:文件 ...
- C#高级编程笔记2016年10月12日 运算符重载
1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...
- C#高级编程笔记 Day 7, 2016年9月 19日 (泛型)
1.协变和抗变 泛型接口的协变 如果泛型类型用 out 关键字标注,泛型接口就是协变的.这也意味着返回类型只能是 T. 接口IIndex 与类型T 是协变的,并从一个制度索引器中返回这个类型. pu ...
- UNIX环境高级编程笔记之高级I/O
本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 readv和writev函数,以及存储映射I/O ...
随机推荐
- 关于Django报错django.core.exceptions.ImproperlyConfigured: Requested setting DEBUG, but settings are not configure
报错代码:django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but se ...
- UML第二次作业
一.plant UML语法学习小结 1.类之间的关系 使用.. 来代替 -- 可以得到点 线. 在这些规则下,也可以绘制下列图形 @startumlClass01 <|-- Class02 Cl ...
- MySQL 多表查询 学习与练习
一.介绍 首先先准备表 员工表和部门表 #建表 create table department( id int, name varchar(20) ); create table employee1( ...
- Javascript高级编程学习笔记(95)—— WebGL(1) 类型化数组
WebGL webgl 是针对 canvas 的 3D上下文,与其它Web技术不同,WebGL并非是W3C制定的标准,而是由 Khronos Group 制定的. 类型化数组 WebGL所涉及的复杂运 ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- springboot~hazelcast缓存中间件
缓存来了 在dotnet平台有自己的缓存框架,在java springboot里当然了集成了很多,而且缓存的中间件也可以进行多种选择,向redis, hazelcast都是分布式的缓存中间件,今天主要 ...
- 谈谈axios配置请求头content-type
现在前端开发中需要通过Ajax发送请求获取后端数据是很普遍的一件事情了,鉴于我平时在撸码中用的是vue技术栈,今天这里来谈谈我们常用的发Ajax请求的一个插件-axios. > 现在网上可能发送 ...
- TypeScript|Angular踩坑笔记
今天按照Angular官网玩了下demo程序,踩了个小坑,记录下. TypeScript可以将变量申明为自定义类型,同时也不对该类型进行检查(不像C#,如果没有这个类型会报错) 比如下面这样: 如果我 ...
- Java基础系列--HashMap(JDK1.8)
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10022092.html Java基础系列-HashMap 1.8 概述 HashMap是 ...
- Tkinter小技巧:如何为窗口右上角的‘x’添加一个自定义的响应函数
不废话,直接上代码 import tkinter as tk from tkinter import messagebox main_window = tk.Tk() main_window.geom ...