IOS 笔记 《一》:内存管理
来源:互联网 发布:手机看图纸软件 编辑:程序博客网 时间:2024/06/06 02:04
[^footnote]ps:学习IOS很长时间了,一直没总结过,以后尽量一周写一篇。
提到内存管理就要提 MRR(manual retain-release) 和 ARC(Automatic Reference Counting)
先说 MRR(manual retain-release)
OC创建对象原理
1.分配内存空间,存储对象
2.初始化成员变量
3.反回对象的指针地址
Mine *mine = [Mine alloc] init];//或 Mine *mine = [Mine new];
1.对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据,当我们的引用计数retainCount = 0的时候,系统会毫不犹豫回收当前对象
2.[对象 release] reatinCount - 1
3.[对象 retain] reatinCount + 1 ,返回self
4.我们的引用计数retainCount = 0的 对象就被销毁了
.dealloc函数,当一个对象要被销毁的时候,系统会自动调用dealloc函数,通知对象你将要被销毁
所以MRR原则:只要出现了 new,alloc,retain,就一定配对出现一个release,autorelease
一般造成野内存泄漏有几种情况,reatinCount不为0,reatinCount为0了,对象没有=nil,而还在使用这个对象
(默认情况下xcode为了提高编码效率,不会时时检查僵尸对象) ,还有就是 对象先为nil ,在release。
多个对象相互应用就要 用 autorelease 放到池子里,自动 release 一次。
重点说ARC(Automatic Reference Counting)
1.强指针 Strong
2.弱指针 weak
只要有强指针指向一个对象,那么系统就不会回收该对象
只要没有强指针指向对象,系统立即回收该对象
//弱指针不影响,对象被回收
使用ARC必须遵守的规则
l 不可以再显示调用dealloc、或实现调用retain、release、retainCount、autorelease这些方法。也不能使用@selector(retain), @selector(release),等等。
在ARC下去自定义dealloc方法不需要调用 [super dealloc],(实际上如果你调用了 [super dealloc],编译器会报错)。super的调用是由编译器自动强制执行的。
l 不能使用NSAllocateObject或NSDeallocateObject。
使用alloc来创建对象,由ARC来管理对象运行时的释放。
l 不能在C语言的结构体中使用对象指针。
建议使用Objective-C的class来管理数据格式,来代替C语言的struct。
l 不能隐式转换 id和void *。
你必须告诉编译器转换的类型。当你需要在obj-C的对象和Core Foundation 类型之间转换时,你可以通过函数的参数来做。详见“Managing Toll-Free Bridging”
l 不能使用NSAutoreleasePool对象。
l 不能使用memory Zone。
因为现在Objective-C运行时已经忽略NSZone了,所以没必要再使用NSZone了
Property 属性
l assign: 简单赋值,不更改索引计数(Reference Counting)。
l copy: 建立一个索引计数为1的对象,然后释放旧对象(开辟新的内存地址)
l retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
retain的实际语法为:
(void)setName:(NSString *)newName {
if (name != newName) {
[name release];
name = [newName retain];
// name’s retain count has been bumped up by 1
}
}
说了那么麻烦,其实接下来的话最重要:
如果你不懂怎么使用他们,那么就这样
· 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
· 使用copy: 对NSString
· 使用retain: 对其他NSObject和其子类
l nonatomic关键字:
atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
iOS 5 中对属性的设置新增了strong 和weak关键字来修饰属性(iOS 5 之前不支持ARC)
l strong关键字:
strong 用来修饰强引用的属性;对应原来的retain。
该属性值对应 __strong 关键字,即该属性所声明的变量将成为对象的持有者。
l weak关键字:
weak 用来修饰弱引用的属性;对应原来的assign。
但是不同的是当对象被释放以后,对象自动赋值为nil;并且,delegate 和 Outlet 苹果推荐用 weak 属性来声明。同时,如上一回介绍的 iOS 5 之前的版本是没有 __weak 关键字的,所以 weak 属性是不能使用的。这种情况我们使用 unsafe_unretained。
- IOS 笔记 《一》:内存管理
- iOS内存管理(一)
- iOS内存管理(一)
- iOS内存管理(一)
- iOS笔记:内存管理
- iOS笔记:内存管理
- iOS 内存管理笔记
- IOS内存管理笔记
- iOS学习笔记之手动内存管理(一)
- iOS 内存管理(一)
- iOS:内存管理(一)
- iOS内存管理(一)
- IOS学习笔记:内存管理
- iOS笔记-手动内存管理
- iOS内存管理学习笔记
- ios之ARC内存管理(一)
- iOS 之OC内存管理(一)
- IOS开发中的内存管理(一)
- 修改自定义key store 别名和密码
- Num 39 : HDOJ : 2030 汉字统计 [ 汉字的字符处理 ] [ 转载 ]
- Android AIDL Service 跨进程传递复杂数据
- android:设置密码隐藏与显示
- js this
- IOS 笔记 《一》:内存管理
- Android AIDL Service 跨进程传递复杂数据
- jquery 获取本身HTML
- 获取OlapConnection连接
- 控制流
- Spark入门实战系列--6.SparkSQL(下)--Spark实战应用
- 使用 daemon()函数创建守护进程的用法,变为守护进程后程序每 60 秒打印当前的时间信息到/tmp/daemon.log 文件中
- 在SSH整合过程中ClassCastException:xxx_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy
- Kafka文件存储机制那些事