block在類中的使用:
1.block在類中作為引數
返回型別
-(void)gotoschool:(void (^)(nsstring *name))myblock;
引數 block名稱
指向乙個函式棧空間
2.在類中宣告為屬性 形參
@property(copy) void (^myblock)(nsstring *name);
^為block標誌 myblock為block的名稱
block
屬性的宣告
,首先需要使用
copy
修飾,只有
copy
後的block
才會放在堆中,棧中的
block
生命週期是和棧繫結的,棧中變數的生命週期是由系統決定的。
另乙個需要注意的問題是關於執行緒安全,在宣告
block
屬性時,需要確認
「再呼叫
block
時另乙個執行緒有沒有可能去修改
block?」
。如果確定不會有這種情況的發生,那麼
block
屬性就可以使用
nonatomic
來修飾,如果不確定的話(一般都是這種情況)
,那麼你首先需要宣告
block
屬性為atomic,
也就是保證變數的原子性
atomic
:在多執行緒環境下,編譯器會自動生成一些互斥加鎖**,避免該變數的讀寫不同步問題
nonatomic:
如果該物件無需考慮多執行緒的話,我們可以使用這個屬性,這樣是編譯器少生成一些互斥加鎖**,這樣可以提高效率
atomic
是objc
使用的一種多執行緒保護技術,主要是防止在寫入資料未完成時,被其他執行緒讀取資料,造成資料錯誤,這種機制是非常浪費系統資源的,一般在手機裝置上,如果沒有用多執行緒間的通訊程式設計,我們可以使用
nonatomic
來提高系統效率。
例如,我們先定義乙個
block
typedef void (^myblocktype)(nsstring name);
接著使用
block
宣告乙個屬性
,系統預設是
atomic屬性
@property(copy) myblocktype myblock;
雖然有了
atomic
來保證屬性的原子性,但是還沒有達到執行緒安全,再呼叫時,我們先把
block
賦值給本地變數,防止
block
突然改變,如果不這樣做的話,即使我們判斷了
block
屬性不為空,在呼叫之前,如果另乙個執行緒突然把
block
屬性設定為空,那麼就會造成程式的
crash
**如下:
//
不完善**,可能會造成
crash
if(self.myblock)
// 正確的**
myblock block=self.myblock;
if(block)
(mrc)
myblock block=[self.myblock retain];
if(block)
[block release];
在這裡如果不使用
retain
的話,block
就不具備持有
self.myblock
物件,如果
self.myblock
被設定為空,就有可能使
block
變成野指標。
關於迴圈引用問題 在
arc下,在呼叫
block
時,我們要使用
__weak
來修飾self
,只有這樣我們才可以解決迴圈引用的問題。 使用
__weak
修飾的指標,在使用後系統自動給它賦值為
nil
//ios 5
之前可以用
__unsafe_unretained
//__unsafe_unretained typeof(self) weakself = self;
__weak typeof (self) weakself=self;
self.myblock_1:^(nsstring *) ;
在非arc
顯然我們不能使用弱引用,這裡我們直接使用
block
來修飾,記住在這裡使用
block
不會造成迴圈引用。
__block typeof (self) weakself=self;
self.myblock:^(nsstring *)
Block的使用 初探Block
看了兩天的block。網上是有非常多解說與教程,也有講得非常好的。這裡就主要解說下我的理解與收穫。歡迎拍磚。所謂block。我覺得應該是乙個閉包函式。而閉包,就是說block以及內部全部的變數生命週期都在其呼叫函式的生命週期內。它一被呼叫完畢,則會被立刻釋放。這裡不講執行機制,僅僅簡要地講基本的用法...
Block語法的使用
block的作用 同 協議 通知一樣用於物件和物件之間的通訊。block的定義 是乙個匿名的函式 塊,此 塊可以作為引數傳遞給其他物件。block的應用場景 物件與物件之間的通訊。block的語法 block的宣告 第一種 int myblock int 第二種 typedef int mybloc...
關於Block的使用
關於block 的定義 這裡我用typedef 宣告乙個返回值為整型 有乙個引數的block typedef void block nsinteger x 下面定義並且實現乙個block block block nsinteger x 這裡只是給block賦值了 但是沒有呼叫block 但是下面這種...