IOS BLOCK收集


在ios,blocks是對象,它封裝了一段代碼,這段代碼可以在任何時候執行。Blocks可以作為函數參數或者函數的返回值,而其本身又可以帶輸入參數或返回值。它和傳統的函數指針很類似,但是有區別:blocks是inline的,並且它對局部變量是只讀的。 
Blocks的定義: 
         int (^Multiply)(int, int) = ^(int num1, int num2) {return num1 * num2;}; 
定義了一個Multiply的blocks對象,它帶有兩個int參數,返回int。等式右邊就是blocks的具體實現,注意{}blocks體里的;。 
Blocks可以訪問局部變量,但是不能修改。 
              int multiplier = 7; 
     int (^myBlock)(int) = ^(int num) { 
         multiplier ++;//編譯報錯 
         return num * multiplier; 
     }; 
如果要修改就要加關鍵字:__block 
         __block int multiplier = 7; 
     int (^myBlock)(int) = ^(int num) { 
         multiplier ++;//這樣就可以了 
         return num * multiplier; 
     };


...

在引用計數的環境里面,默認情況下當你在 block 里面引用一個 Objective-C 對象的時 候,該對象會被 retain。當你簡單的引用了一個對象的實例變量時,它同樣被 retain。 但是被__block 存儲類型修飾符標記的對象變量不會被 retain. 注意:在垃圾回收機制里面,如果你同時使用__weak 和__block 來標識一個變量,那么該 block 將不會保證它是一直是有效的。

如果你在實現方法的時候使用了 block,對象的內存管理規則更微妙: 如果你通過引用來訪問一個實例變量,self 會被 retain。
如果你通過值來訪問一個實例變量,那么變量會被 retain。

 

 
dispatch_async(queue, ^{
 
// instanceVariable is used by reference, self is retained
 
doSomethingWithObject(instanceVariable);
 

});

 
 
 
id localVariable = instanceVariable;
 
dispatch_async(queue, ^{
 

// localVariable is used by value, localVariable is retained (not self)

 
doSomethingWithObject(localVariable);
 

});



拷貝Blocks

通常,你不需要 copy(或 retain)一個 block.在你希望 block 在它被聲明的作用域 被銷毀后繼續使用的話,你子需要做一份拷貝。拷貝會把 block 移到堆里面。

你可以使用 C 函數來 copy release 一個 block:

如果你使用 Objective-C,你可以給一個 block 發送 copy、retain release(或 autorelease)消息。

為了避免內存泄露,你必須總是平衡 Block_copy()和 Block_release()。你必須平衡 copy retain release(或 autorelease)--除非是在垃圾回收的環境里面。

 

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM