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 ...
随机推荐
- 数据库之redis篇(3)—— Python操作redis
虽然前面两篇已经说了redis的一些配置安装什么的,篇幅有点长,可能看完了也不知道怎么操作,这里再浓缩一下: 什么是redis redis完全开源免费的,遵守BSD协议,是一个高性能的非关系型key- ...
- windows下nginx的安装及使用
安装过程比较简单 1.下载nginx http://nginx.org/en/download.html 下载稳定版本,以nginx/Windows-1.14.2为例,直接下载 nginx-1.14. ...
- 微信小程序小结02-- 完整的demo
小程序确实方便,在移动端方便小个体宣传,不需要服务器和域名,还有客服功能.按朋友的意思,做了一次调整,分成了首页.预约和我的三个页面. 下面说下遇到的几个问题. 01.客服功能 不得不说这个一条龙服务 ...
- Linux 桌面玩家指南:13. 使用 Git 及其和 Eclipse 的集成
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Java核心技术第五章——2.Object类
Object类:所有类的超类 Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的.但是并不需要这样写: public class Emloyee extends Object ...
- 【Python实践-2】求一个或多个数的乘积
# -*- coding: utf-8 -*- #定义一个函数,可接收一个或多个数并计算乘积 def product(*numbers): s=1 for n in numbers: s=s*n re ...
- IntelliJ IDEA激活,永久有效
2017.3.4版本 正版的idea实在太贵了,有能力请支持正版. 下载jar包,放置在idea的bin目录下,传送门 https://files.cnblogs.com/files/dslx/Jet ...
- 深度学习之卷积神经网络(CNN)详解与代码实现(二)
用Tensorflow实现卷积神经网络(CNN) 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10737065. ...
- Asp.Net Core 轻松学-从安装环境开始
Asp.Net Core 介绍 Asp.Net Core是微软新一代的跨平台开发框架,基于 C# 语言进行开发,该框架的推出,意味着微软从系统层面正式进击 Linux 服务器平台:从更新速度开 ...
- python学习第九讲,python中的数据类型,字符串的使用与介绍
目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...