ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切。
注意:ARC 是编译器特性(ARC是在编译时插入内存管理代码,不影响运行时效率),而不是 iOS 运行时特性(除了weak指针系统),它也不是类似于其它语言中的垃圾收集器(其他语言的垃圾回收机制发生在运行时,所以会影响运行效率)。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化。
ARC 的规则非常简单:只要还有一个变量指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。这条规则对于实例变量、synthesize属性、局部变量都是适用的。
例如 一、 NSString * name1 = @"ningning";
__weak NSString * name2 = name1;
这里的name2只是也跟name1一样指向了NSString(@"ningning")这个对象,但是他不是这个对象的拥有者,这个对象的引用计数还是1,如果@"ningning"这个对象呗name1释放掉的话,name2的就会立即指向nil(当然了,这是在ARC的情况下,mrc下对应的是assign,name2还是会指向已经被释放的地址空间,产生野指针,导致crash),而不是产生crash。
二、 __weak NSString *str = [[NSString alloc] initWithFormat:@"1234"];
NSLog(@"%@", str); // 打印出来是"(null)"
因为str是weak指针,是不持有对象的,所以对象创建出来之后就立马释放掉了。
weak :有一个作用就是 防止循环引用,导致内存无法释放。例如delegate模式,controller 里面通过strong指针 self.view拥有一个 tableview,但是tableview的delegate和datasource都是weak指针,指向你的controller。
//顺便说一下为什么NSString修饰的属性是copy
举个例子吧,
@property(nonatomic,retain) NSString * name;//用retain修饰
NSMutableString * stu = [[NSMutableString alloc]initWithFormat:@"1111"];
self.name = stu;
NSLog(@"%@",_name);//打印的是1111
[stu appendString:@"dddd"];
NSLog(@"%@",self.name);//打印的是1111dddd(原本不能改变的string结果页改变了)
@property(nonatomic,copy) NSString * name;//用retain修饰
NSMutableString * stu = [[NSMutableString alloc]initWithFormat:@"1111"];
self.name = stu;
NSLog(@"%@",_name);//打印的是1111
[stu appendString:@"dddd"];
NSLog(@"%@",self.name);//打印的是1111(没有改变)
也就是说,用copy来修饰string是最安全的,目前为止 就知道这些。。。
ARC情况下:
1.ARC只能工作于object-c对象,如果应用了core foundation 或者 malloc()/free()还是要自己手动管理内存的。
2.不能再使用NSAutoreleasePool对象,ARC提供了@autoreleasepool块来代替它,这样更有效率
3.不能使用内存存储区 NSZone
4.声明IBOutlet时,一般使用weak,除了对StoryBoard这样nib中间的顶层对象要用strong;
5.weak 相当于mrc下的assign,strong 相当于mrc下的retain。