IOS中Block的使用

2021-08-02 20:50:06 字數 1988 閱讀 7158

block的宣告:

1,void (^myblock)()

2,int (^myblock)(float,int)

3,nsstring* (^myblock)(int, nsstring*)

也可以使用typedef為block定義別名。

三種block的特性

block是乙個object物件,所以我們需要對它進行記憶體管理。

block分為三種,nsconcretestackblock,nsconcretemallocblock,nsconcreteglobalblock。

表面上看都是block,但是它的isa指標會指向這三種不同的block,後面會介紹isa。

下面分別解釋這三種block:

nsconcretestackblock,棧block。

當block中只用到外部區域性變數,成員變數,並且沒有強指標引用的block都是stackblock。

這種block由系統管理記憶體,並且不會持有物件,對它進行retain,release也會無效,copy後會變成mallocblock。

nsconcretemallocblock,堆block。

用copy修飾的block會copy乙份到堆上,成為mallocblock,arc中用strong修飾也會執行copy。

這種block需要手動管理記憶體,並且會持有物件。

nsconcreteglobalblock,全域性block。

沒有用到外部變數或者只用到全域性變數或靜態變數的block是globalblock。

這種block生命週期是應用開始到結束。

不會持有物件,對它進行retain,release,copy都會無效。

我們在使用block的時候,並不希望讓系統去管理記憶體,這樣很不安全。

所以要把stackblock通過copy變成mallocblock再去使用。

當block作為屬性的時候,我們可以加入copy的關鍵字。

當block作為方法引數傳入的時候,我們可以手動去copy。

迴圈引用

從上面我們看到mallocblock會持有物件。

當在block中使用self的時候,由於self持有者該block,block又持有self,就會造成迴圈引用。

這時有如下幾種辦法:

1,通過加入weak弱引用self去解決,__weak __typeof(self)weakself = self;

其中__typeof(self)的意思是建立乙個與self相同類的例項。

如果在block中多次使用self,我們需要強引用去防止被提前釋放,__strong __typeof(self)strongself = weakself;

2,使用類方法傳入block,讓別的類去持有,這樣別的類持有block,block持有self,當別的類被釋放的時候,block就會被釋放,self也會被釋放。

這樣做self相當於被別的類持有。

3,在block執行完成以後,手動去將block設為 nil,從而釋放block持有的self。

block持有self的時候,當block釋放以後,self也就會被釋放了。

__block

block中不可以修改或賦值,需要新增__block修飾。

但是nsmutablearray和nsmutablestring的新增刪除不需要新增__block修飾,因為位址並沒有變。

isa

isa是元指標,每乙個物件都有乙個isa指標,指向類物件。

類物件也是物件,類物件的isa指標指向元類(meteclass)物件。

元類也是物件。所以元類也有isa指標,最終指向根元類(root meteclass)物件,根元類則指向自身。

元類中儲存了類方法列表,類版本號,類名等資訊。

類方法其實就是呼叫元類的方法列表,當類方法被呼叫的時候會先從本身查詢類方法的實現,如果沒有,會向父類查詢。

iOS開發中block的使用

block簡介 block的實際行為和function很像,最大的差別是在可以訪問同乙個scope的變數值。block實體形式如下 傳入引數列 block實體開頭是 接著是由小括號所包起來的引數列 比如 int a,int b,int c 行為主體由大括號包起來,專有名字叫做block litera...

iOS中block的定義和使用

1.block可以用來儲存一段 或者用來封裝一段 段,塊。2.block的標誌是 3.block跟函式很像 可以儲存 可以有返回 值 也可以有行參 呼叫方式一樣 4.定義乙個block pragma mark 不帶引數的block void outputblock outputblock 5.帶行參...

IOS中block的使用方法

x.1 初探block 在這一小節我們先用一些簡單範例來匯入block的概念。x.1.1 宣告和使用block 我們使用 運運算元來宣告乙個block變數,而且在block的定義最後面要加上 來表示乙個完整的述句 也就是將整個block定義視為前面章節所介紹的簡單述句,因為整個定義必須是乙個完整的句...