block的使用細節

2021-07-23 08:26:59 字數 2493 閱讀 3198

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 但是下面這種...