學習筆記-weak strong ARC mrc

     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。

相關文章
相關標籤/搜索