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。

0 0
原创粉丝点击