Block的宣告和執行緒安全

2021-07-11 21:33:29 字數 1057 閱讀 3277

block屬性的宣告,首先需要用copy修飾符,因為只有copy後的block才會在堆中,棧中的block的生命週期是和棧繫結的,可以參考之前的文章(ios: 非arc下返回block)。

另乙個需要注意的問題是關於執行緒安全,在宣告block屬性時需要確認「在呼叫block時另乙個執行緒有沒有可能去修改block?」這個問題,如果確定不會有這種情況發生的話,那麼block屬性宣告可以用nonatomic。如果不肯定的話(通常情況是這樣的),那麼你首先需要宣告block屬性為atomic,也就是先保證變數的原子性(objective-c並沒有強制規定指標讀寫的原子性,c#有)。

比如這樣乙個block型別:

typedef

void (^myblocktype)(int);

屬性宣告:

@property (copy) myblocktype myblock;
這裡arc和非arc宣告都是一樣的,當然注意在非arc下要release block。

但是,有了atomic來保證基本的原子性還是沒有達到執行緒安全的,接著在呼叫時需要把block先賦值給本地變數,以防止block突然改變。因為如果不這樣的話,即便是先判斷了block屬性不為空,在呼叫之前,一旦另乙個執行緒把block屬性設空了,程式就會crash,如下**:

if (self.myblock)

所以正確的**是(arc):

myblocktype block = self.myblock;

//block現在是本地不可變的

if (block)

在非arc下則需要手動retain一下,否則如果屬性被置空,本地變數就成了野指標了,如下**:

//非arc

myblocktype block = [self.myblock retain];

if (block)

[block release];

Block的安全用法

block用的越來越多 block被濫用 block被亂用 現在總結乙個安全可靠的使用方法 weak typeof self weakself self void myblock void 複製 是的,就是這個模式 在block外定義乙個weak self.在block內對weak self定義乙個...

執行緒的宣告週期和狀態

新建 new 新建立乙個執行緒 就緒 runnable 執行緒物件建立後,其他執行緒呼叫了該物件的start方法,該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取cpu的使用權 執行 running 就緒狀態的執行緒或者cpu 的使用權,執行程式 阻塞 blocked 阻塞狀態是執行緒因為某...

Java執行緒安全和非執行緒安全

arraylist是非執行緒安全的,vector是執行緒安全的 hashmap是非執行緒安全的,hashtable是執行緒安全的 stringbuilder是非執行緒安全的,stringbuffer是執行緒安全的 什麼是執行緒安全?執行緒安全和非執行緒安全有什麼區別?分別在什麼情況下使用?非執行緒安...