-----------android培训、java培训、java学习型技术博客、期待与您交流!-----------
OC中ARC下内存管理
一、指针分类
1、强指针:默认情况下,所有的指针都是强指针,关键字是strong
2、弱指针:_ _weak关键字修饰的指针
二、ARC
ARC是编译器特性,编译器在编译的时候自动进行释放
当对象被弱指针指向时才能被释放
三、ARC下但对象内存管理
在ARC下对象释放的判断依据是:对象没有强指针指向
#import <Foundation/Foundation.h>
@interface Car: NSObject
-(void)run;
@end
@implementation Car
-(void)dealloc{
//ARC下不允许调用[super dealloc];方法
NSLog(@"car dealloc");
}
-(void)run{
NSLog(@"车在跑");
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//在此处输入Objective-C代码
Car *car = [Car new];
[car run];
[pool drain];
return 0;
}
1、在ARC机制下 当对象 的值为nil(0) 时对象会立即释放,因为没有强指针指向它
四、在ARC下@property的参数
strong :适用于OC对象,相当于MRC中的retain
weak:用于OC对象,相当于MRC中的assign
copy:一般用于NSString,和MRC中的copy一样
五、ARC下多对象内存管理
在ARC机制下不能再使用retain、release等词
@property参数有两个分别是strong和weak
1、@property (nonatomic, strong) Dog *dog;
相当于生成了
/*
__strong Dog * _dog;
*/
strong为强指针指向
2、@property(nonatomic, weak)Dog *dog;
相当于生成了
/*
__weak Dog * _dog;
*/
weak为弱指针指向
总结:
1、当对象没有强指针指向时对象所占内存空间就会释放
2、当对象有强指针指向时直到代码块结束,局部变量的释放的时候对象多占的空间也被释放
3、当对象值为nil时 对象立刻被释放
六、ARC下循环应用问题
当两个对象都使用的是strong类型时,并且两个对象存在关联关系时,会造成内存泄露
例如在MRC中所提到的Person类和Dog类的关系,人拥有一条狗,狗有个主人,此时就会出现了循环应用问题
1、当在@property 中的参数都使用strong类型时,会发生内存泄露,因为两个强指针互相指向对方,无法释放如下图
2、解决此问题的方法是:一个对象中使用 strong类型,另一个对象中使用weak类型,因为一个是强指针,另一个是弱指针,相互指向的时候回先释放弱指针指向的对象再释放 两一个对象如下图,会先释放Person所占的内存空间再释放Dog所占的内存空间
七、ARC的特点和使用注意事项
特点:
1、ARC中不允许使用release,retain,retainCount
2、允许重写dealloc,但是不允许调用[super dealloc]
3、@property参数
strong:成员变量是强指针、适用于OC对象类型相当于原来的retain
weak:成员变量是弱指针、适用于OC对象类型
assign:使用于非OC对象类型(基础类型)
注意事项:
1、ARC中,只要弱指针指向的对象不在了,就直接把弱指针清空赋值为nil
2、__weak Person *p = [[Person alloc] init ];这种写法是不合理的,对象以创建出来就会被释放掉,ARC会把指针设置为nil
3、ARC在@property的参数中不能使用retain,而是使用strong ,在dealloc 中不需要再调用 [ super dealloc]
4、如果是弱指针,则@property的参数为weak ,不需要加 __
八、ARC的兼容和转换
1、ARC模式下兼容非ARC的类
找到项目——选择targets ——build Phases ——Compile Sources——选择将非ARC文件——双击——在框中输入-fno-objc-arc——点击空白处即可
2、将MRC转为ARC
选择要转换的targets——Edit——Refactor——Convert to Object—C ARC——勾选需要转换的targets——check——next——save即可