IOS6學習筆記(三)

1.ARC空聲明變量編程

  使用ARC的另外一個優點是全部未初始化的變量默認都是「空值化」的。這意味着像下面這樣的聲明使用ARC編譯後指向的是空值(nil):編程語言

  NSObject *myObject1,*myObjects2;ui

  不過要注意的是,與其餘高級編程語言不一樣,ARC不會自動將標量的值設置爲零。spa

  這意味着如下幾行代碼聲明的變量其值並不等於零:指針

  int a;orm

  int b;對象

2.Objective-C命名約定內存

  若是你在Person對象中寫了一個叫作newPersonName的方法,ARC會認爲該方法返回一個分配過的對象。使用ARC(或者不適用ARC)編譯過的調用代碼和方法newPersonName運行時一切正常。可是若是這一方法所在的類沒有使用ARC編譯而調用方法使用了ARC編譯,程序就會奔潰。反過來,若是newPersonName方法是使用ARC編譯的而調用代碼沒有,就會出現內存泄露。編譯器

3.覆蓋默認行爲it

  雖然從技術上說咱們沒法覆蓋LLVM的行爲,但仍是可使用Clang源標註NS_RETURNS_RETAINED和NS_RETURNS_NOT_RETAINED來更改方法。newPersonName方法能夠像下面這樣標註,以告訴ARC編譯器:儘管該方法名稱前面是new,返回的倒是未保留過的對象指針。

  -(NSString *)newPersonName NS_RETURNS_NOT_RETAINED;

 4.自由橋接

  與Objective-C庫不一樣,咱們在Objective-C中使用的標準C語言和Core Fundation類庫(CF *方法)不會遵循那些命名約定。這意味着ARC編譯器沒法百分百地釋放不須要的內存。在ARC出現以前,我麼能夠將CF*對象強制轉變成NS*對象,這稱爲自由橋接(toll-free bridging)。也就是說,咱們能夠將CFString*經過類型轉換變成NSString*類型。而有了ARC,咱們便沒法再這麼作了,至少不指定一個全部權轉移修飾符時確實如此。

  ARC容許使用一下這些全部權轉移修飾符:

  __bridge

  __bridge_retained

  __bridge_transfer

  1.__bridge

  它告訴ARC不要增長它的引用計數的值,也不要更改全部權。

  2.__bridge_retained

  若想要轉換C指針類型並增長引用計數的值,咱們可使用第二個修飾符。當要從Objective-C方法(它建立一個Core Fundation對象並在以後使用CFRelease方法將其釋放)返回一個保留過的指針時,咱們可使用這個修飾符。若是Objective-C方法屬於NSRETURNS_RETAINDED系列,就要返回保留過的指針。

  3.__bridge_transfer

  若是要將Core Fundation指針類型轉換成Objective-C指針併爲引用計數加1,可使用最後一個修飾符。若Core Fundation方法建立一個對象,而且想要靠ARC來管理對象的內存,咱們即可以使用這個修飾符。

5.忽略performSelector警告

  #pragma clang diagnostic push

  #pragma clang diagnostic ignored "-Warc-performSelector-leaks"

                [uiViewController performSelector:finishMethod withObject:request];

  #pragma clang diagnostic pop

 

6.block引發的循環保留

  使用__block避免循環保留(無ARC)

  __block id safeSelf = self;

  self.myBlock = ^(NSString* returnedString){

  safeSelf.labelControl.text = returnedString;

  };

  ARC會改變__block的語義,所以不該該使用它。在ARC中,__block引用會被保留而不是被複制,這意味着在ARC環境中前面的代碼仍然會引起循環保留。正確地方法是使用__weak或(__unsafe_unretained)引用,如:

  

  使用__weak避免循環保留(有ARC)  

  __weak typeof(self) safeSelf = self;//IOS 5+

  //__unsafe_unretained typeof(self) safeSelf = self;//IOS 4+

  self.myBlock = ^(NSString* returnedString){

  safeSelf.labelControl.text = returnedString;

  };

相關文章
相關標籤/搜索