ARC是自iOS 5以後增長的新特性,徹底消除了手動管理內存的煩瑣,編譯器會自動在適當的地方插入適當的retain、release、autorelease語句。你再也不須要擔憂內存管理,由於編譯器爲你處理了一切。安全
注意:ARC 是編譯器特性(ARC是在編譯時插入內存管理代碼,不影響運行時效率),而不是 iOS 運行時特性(除了weak指針系統),它也不是相似於其它語言中的垃圾收集器(其餘語言的垃圾回收機制發生在運行時,因此會影響運行效率)。所以 ARC 和手動內存管理性能是同樣的,有時還能更加快速,由於編譯器還能夠執行某些優化。app
ARC 的規則很是簡單:只要還有一個變量指向對象,對象就會保持在內存中。當指針指向新值,或者指針再也不存在時,相關聯的對象就會自動釋放。這條規則對於實例變量、synthesize屬性、局部變量都是適用的。性能
例如 1、 NSString * name1 = @"ningning";
__weak NSString * name2 = name1;優化
這裏的name2只是也跟name1同樣指向了NSString(@"ningning")這個對象,可是他不是這個對象的擁有者,這個對象的引用計數仍是1,若是@"ningning"這個對象唄name1釋放掉的話,name2的就會當即指向nil(固然了,這是在ARC的狀況下,mrc下對應的是assign,name2仍是會指向已經被釋放的地址空間,產生野指針,致使crash),而不是產生crash。
atom
2、 __weak NSString *str = [[NSString alloc] initWithFormat:@"1234"];
NSLog(@"%@", str); // 打印出來是"(null)"
spa
由於str是weak指針,是不持有對象的,因此對象建立出來以後就立馬釋放掉了。指針
weak :有一個做用就是 防止循環引用,致使內存沒法釋放。例如delegate模式,controller 裏面經過strong指針 self.view擁有一個 tableview,可是tableview的delegate和datasource都是weak指針,指向你的controller。 orm
//順便說一下爲何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。