autorelease的使用
autorelease会将对象放到一个而自动释放池里,当自动释放池销毁时,会对池子里的所有对象做一次release操作,注意不是销毁,仅仅是release。
自动释放池的创建
@autoreleasepool{
Person *p = [[[Person alloc] init] autorelease];
},
大括号的开始是池子的创建,大括号的结束是池子的销毁,此时做release操作。有了自动释放池我们就不用在最后加上[p release];这样的语句。
好处:精简了代码,而且我们也不用考虑[p release];这样语句的位置,不用担心在释放之后才使用对象
坏处:不能精确释放对象的时间,只适用于占用内存小的对象,所以还是尽量使用release
我们看如Person *p = [[[Person alloc] init] autorelease];这样的创建,也是很麻烦的,所以在开发中,需要些一些类方法,来快速创建autorelease过的对象:
+ (id)person
{
return [[[self alloc] init] autorelease];
//要多使用self,而不是类名
}
使用自动释放池的注意点
一.错误写法
1.alloc之后调用了autorelease方法之后,又去调用release方法
@autoreleasepool
{
Person *p = [[[Person alloc] init] autorelease];
[p release];
}
2.连续多次调用autorelease,这样是会造成野指针错误的(指向僵尸对象的指针称为野指针)
Person *p = [[[[Person alloc] init] autorelease] autorelease];
二. 自动释放池
1.在ios程序运行过程中,会创建无数个自动释放池,这些池子都是以栈结构存在(先进后出)
2.当一个对象调用autorelease方法时,会将这个对象方法放到栈顶的释放池
3.系统中自带的方法中如果没有alloc,new,copy,说明都是autorelease过的
ARC(automatic reference counting)
Xcode的编译器特性:自动引用计数器,编译器内部自动添加内存相关的代码,也就是我们使用ARC就不用考虑内存管理了,怎么写都是对的。
ARC原理:只要没有强指针指向对象,对象就会被释放,这是唯一原则
默认情况下,所有的指针都是强指针,当指针被回收时,或者指针指向别的对象时就回收对象
定义弱指针__weak int *p;注意是两个下划线,这个p就是弱指针。
当我们这样创建对象时:__weak Person *p = [[Person alloc] init];,这个对象时不能被创建的,直接释放。
ARC特点:
1.不允许调用release,retain,retainCount
2.允许重写dealloc,但是不允许调用[super dealloc];方法
3.@property的参数
* strong:成员变量是强指针,适用于OC对象
* weak:成员变量时弱指针,适用于OC对象
* assign:适用于基本数据类型
4.以前用retain的换成strong
|
|