iOS之輕鬆上手block(下)

2021-07-11 03:50:37 字數 2594 閱讀 1650

筆者不是什麼大神,所以本文只是筆者對block的理解,不代表權威,以免誤導新手,大神莫見笑

block可分為三種
1. 棧block

特點:生命週期由系統控制,函式返回即銷毀

用到區域性變數、成員屬性\變數,且沒有強指標引用的block都是棧block

a.用到區域性變數(圖1),i為區域性變數,block直接在nslog中列印,沒有被指標引用

b.用到成員屬性\變數(圖2),name為成員屬性

2. 堆block

特點:沒有強指標引用即銷毀,生命週期由程式設計師手動管理

棧block如果有強指標引用或copy修飾的成員屬性引用就會被拷貝到堆中,變成堆block

a.強指標引用(圖3),block被testblock引用,testblock就是乙個block型別的強指標(arc環境下預設就是強指標)

b.copy修飾的成員屬性引用(圖4)

3. 全域性block

特點:命長,有多長?很長很長,人在塔在(應用程式在它就在)

沒有用到外界變數,或者只用到全域性變數、靜態(static)變數的block就是全域性block

對於全域性block,有沒有指標引用都不影響,block型別的成員屬性無論是用assign、weak、strong還是copy修飾都無所謂,不過開發中很少用到全域性block,所以不要用weak或assign

a.沒有用到外界變數(圖5),下圖中block沒有用到外界變數,所以就算用weak修飾也是全域性block(舉個例子而已,開發中不要用weak,用了也別說是筆者教的)

b.只用到全域性變數、靜態(static)變數(圖6),str為全域性變數,str1為靜態變數,只用到其中乙個也是全域性block

分類總結

1.沒有用到外界變數或只用到全域性變數、靜態變數的block為全域性block,生命週期從建立到應用程式結束

2.用到區域性變數、成員屬性\變數的block為棧block,生命週期系統控制,函式返回即銷毀

3.有強指標引用或copy修飾的成員屬性引用的block會被複製乙份到堆中成為堆block,沒有強指標引用即銷毀,生命週期由程式設計師控制

a.基本資料型別---區域性變數

block會拷貝該變數的值當做常量使用,外界修改變數的值不會影響block內部,且block內部不能對其修改

block內部修改外界變數i的值直接報錯,如果想要修改,可以在int i = 0前面加上關鍵字__block,此時i等效於全域性變數或靜態變數

外界變數i從0變成了1,block內部列印依然是0

b.基本資料型別---靜態變數、全域性變數、成員屬性\變數

block直接訪問變數位址,在block內部可以修改變數的值,並且外部變數被修改後,block內部也會跟著變

圖中_k為成員屬性\變數,初始值i = 10,j = 20,k = 0,block內部只對i、j、k進行一次自增操作,列印結果卻是i = 12,j = 22,k = 2,所以外部的自增操作也影響了內部,即訪問的是同乙個記憶體位址

c.指標型別---區域性變數

block會複製乙份指標並強引用指標所指物件,且內部不能修改指標的指向

圖中被注釋掉的**試圖修改指標指向,所以會報錯(如果想要修改,在前面加上__block),但是可以修改所指物件的值,如str從「abc」變成了「abcdef」

d.指標型別---全域性變數、靜態變數、成員變數\屬性

block不會複製指標,但是會強引用該物件,內部可修改指標指向,block會強引用成員屬性\變數所屬的物件,這也是為什麼block屬性內部用到self.***會引起迴圈引用的原因

圖中str2為成員屬性,由於nsstring是不可變的,所以從列印結果可以看出,在block內部修改了外界指標變數的引用,指向了新的字串

iOS之輕鬆上手block(下)

block可分為三種1.棧block 特點 生命週期由系統控制,函式返回即銷毀 用到區域性變數 成員屬性 變數,且沒有強指標引用的block都是棧block a.用到區域性變數 圖1 i為區域性變數,block直接在nslog中列印,沒有被指標引用 b.用到成員屬性 變數 圖2 name為成員屬性 ...

iOS 底層原理之 Block

block 本質上也是乙個 oc 物件,它內部也有個 isa 指標 block 是封裝了函式呼叫以及函式呼叫環境的 oc 物件 block 的底層結構如下圖所示 原始碼解析 struct gsblock load block impl 0 block impl struct block impl g...

iOS開發之block解析

1.block的本質是乙個objective c的物件。為什麼這麼說?在objective c中。runtime會在執行時依據物件的isa指標的指向,來度額定這個物件的型別。也能夠覺得乙個物件。它具有isa指標。就是乙個oc物件 2.你怎麼知道block有isa指標呢。我們能夠通過clang命令將來...