ARC是什么:
1.ARC是编译器特性,而不是运行时特性;
2.ARC不是其他语言中的垃圾回收,有着本质区别;
ARC的优点:
1.完全消除了手动管理内存的烦琐;
2.基本上能避免内存泄露;
3.有时还能更加快速,因为编译器还可以执行某些优化;
ARC的判断准则:
只要没有强指针指向对象,对象都会被释放,(默认情况下所有的指针都是强指针)
强指针(__strong) 弱指针(__weak)
1 int main(int argc, const char * argv[]) { 2 @autoreleasepool { 3 Person *p =[[Person alloc] init]; 4 p=nil;//执行完这行释放p 5 6 __strong Person *p1 = [[Person alloc] init]; 7 __weak Person *p2 = p1; 8 }//在这行释放p2 9 return 0; 10 }
弱指针,在刚创建完就会被释放。(不要把一个刚刚创建的对象给一个弱指针)
当两个对象互相引用的时候,会出现循环引用,在ARC中的解决办法是:
一个用strong,一个用weak;
Person.h:
#import <Foundation/Foundation.h> @class Dog; @interface Person : NSObject @property(nonatomic,strong)Dog *dog; @end
Person.m:
#import "Person.h" @implementation Person - (void)dealloc { NSLog(@"person dealloc"); } @end
Dog.h:
#import <Foundation/Foundation.h> @class Person; @interface Dog : NSObject @property(nonatomic,weak)Person * person; @end
Dog.m:
#import "Dog.h" @implementation Dog - (void)dealloc { NSLog(@"dog dealloc"); } @end
main.m:
Person * p =[[Person alloc] init]; Dog * dog = [[Dog alloc] init]; p.dog = dog; dog.person = p;
这样处理之后最后就可以全部释放了: