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定義視為前面章節所介紹的簡單述句,因為整個定義必須是乙個完整的句...