------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、基本介绍
使用范围:
原理:
当使用alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1
给对象发送一条retain消息,可以使引用计数器值+1
给对象发送一条release消息,可以使引用计数器值-1
当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,系统也会自动向对象发送一条dealloc消息。
一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法
可以给对象发送retainCount消息获得当前的引用计数器值
二、内存的管理原则
1、谁创建,谁释放。如果你通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放
2、一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
3、谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release
2、一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
3、谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release
三、@class的引入
1、通常引用一个类有两种办法:
2、两种方式的区别
2>@class方式只是告诉编译器在只是在.h文件中对class的声明,具体这个类里有什么信息,这里不需要知道,等实现的文件中真正要用到是,才会真正查看B类中的信息
四、autorelease pool(自动释放池)
1、基本介绍
当自动释放池销毁时,池里面的所有对象都会调用一次release方法
OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)
autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autoreleasepool中,当该pool被释放时,该pool中的所有对象会被调用Release
@autoreleasepool
{// { 开始代表创建了释放池
// autorelease方法会返回对象本身
// 调用完autorelease方法后,对象的计数器不变
// autorelease会将对象放到一个自动释放池中
// 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
Person *p = [[[Person alloc] init] autorelease];
p.age = 10;
@autoreleasepool
{
// 1
Person *p2 = [[[Person alloc] init] autorelease];
p2.age = 10;
}
Person *p3 = [[[Person alloc] init] autorelease];
} // } 结束代表销毁释放池
2、autorelease pool使用注意
不要把大量循环操作放到同一个NSAutoreleasePool之间,这样会造成内存峰值的上升
尽量避免对大内存使用该方法,对于这种延迟释放机制,还是尽量少用
sdk中一般利用静态方法创建并返回的对象都是已经autorelease的,不需要再进行release操作
五、@property参数
默认格式:@property(参数1,参数2)类型名字;
1>set方法内存管理相关的参数
assign : 直接赋值(默认,适用于非OC对象类型)
copy : release旧值,copy新值
2>是否要生成set方法
readonly : 只会生成getter的声明、实现
3>多线程管理
nonatomic : 性能高 (一般就用这个)atomic : 性能低(默认)
4>setter和getter方法的名称
setter : 决定了set方法的名称,一定要有个冒号 :getter : 决定了get方法的名称(一般用在BOOL类型)
六、ARC
ARC的规则:只要还有一个强指针变量指向对象,对象就会保持在内存中
强指针和弱指针
弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误
使用注意:
2、可以重写dealloc,但是不能调用[super dealloc]
3、@property : 想长期拥有某个对象,应该用strong,其他对象用weak
4、其他基本数据类型依然用assign
5、两端互相引用时,一端用strong、一端用weak