首先來概述一下,block物件提供了乙個 特別的(ad hoc)函式,這個函式是使用c和c派生語言(如objective-c和c++)來建立的乙個表示式,block物件在其他語言和環境中有時候可以理解為乙個「閉包(closure)」。除非在某些範圍內它們容易和標準c表示式的**塊混淆,一般情況下我們可以稱之為「blocks塊」,**塊。
乙個block是乙個匿名的內聯**集合體:和函式一樣擁有引數型別,有推斷和宣告的返回型別;可以捕獲它的宣告所在相同作用域的狀態,可以和其他定義在相同作用域範圍的blocks進行共享更改;可以在相同作用域範圍被銷毀後持續共享和更改相同作用域範圍的狀態。
可以把block作為可執行路徑傳遞給其他執行緒(或者在自己執行緒內傳遞給run loop)。編譯器和執行時會在整個block生命週期中為所有的block引用變數保留乙個副本。
block的強大相信可以從本文簡介中隱隱約約體會出來,那麼本文將從block作為物件屬性,作為方法引數,作為返回值型別三個方面對block的使用來進行乙個簡單的使用與體驗示例,熟悉並且回顧,然後深入淺出的從本文開始帶大家進入函式響應程式設計。
block作為物件的屬性:
開啟乙個objective-c專案,在此專案中,我們首先來定義乙個類,此處簡單定義乙個dog類,在dog類中的.**件中宣告乙個block屬性如下:
@property(nonatomic,strong)void(^block)();回到我們的控制器中,倒入標頭檔案,建立物件,並將乙個新的block賦值給我們dog中,所呼叫的block屬性,並呼叫block,具體實現如下:
dog *dog = [[dog alloc]init];block作為方法的引數:void(^block_mbxb)() = ^(){
nslog(@"狗狗不可以隨便拉粑粑");
dog.block = block_mbxb;
dog.block();
繼續在dog類中搞事情,在.**件中宣告方法,宣告乙個返回值,方法名叫eat,引數名為block、型別為block的方法(block本身引數為nsstring型別),宣告**如下:
- (void)eat:(void(^)(nsstring*))block;在.m中實現,**如下:
- (void)eat:(void(^)(nsstring*))block{此時在控制器中,就可以來建立物件,並對物件的方法進行呼叫,**如下:block(@"**");
dog *dog = [[dog alloc]init];block作為返回值:[dog eat:^(nsstring *food) {
nslog(@"狗狗吃%@,吃了一大盆",food);
返回值,當我們使用帶有返回值型別的方法時,當然是把定義方法的返回型別,宣告為block型別,**如下:
- (void(^)(int))eatfood;老套路,在.m中實現,**如下:
- (void(^)(int))eatfood{在控制器中怎麼去處理:return ^(int food){
nslog(@"狗狗吃了**%d斤",food);
dog *dog = [[dog alloc]init];block的基本使用和思想需要我們在程式設計的時候一點一點滲透,體會他的簡單粗暴,體會實現思路的跳躍性,慢慢你會愛上它,在block當作返回值的時候有很大的延伸性,框架masory,masory運用.語法來掉用方法,oc中用.語法來呼叫方法的基本要求,方法必須是get方法,假如說這個get方法的返回值是乙個block那麼就可以用.語法來掉出這個block,大家可以發揮想象dog.eatfood(200);
簡單粗暴介紹rac,reactivecocoa是乙個git開源的函式響應程式設計框架,我們用它可以簡單粗暴的來處理一些事件,常用類:訊號類(racsignal)、訊號類的提供者(racsubject,當然這個類本身也可以充當訊號包括傳送訊號)、協議(racsubscriber,訂閱者,傳送訊號)、racdisposable(取消訂閱)
c部落格位址
類作為方法引數與返回值
一 類作為方法引數 在編寫程式中,會經常碰到呼叫的方法要接收的是乙個類型別的情況,那麼這時,要向方法中傳入該類的物件。如下 演示 classperson 測試類 publicclasstest 定義乙個方法 method 用來接收乙個 person 物件,在方法中呼叫 person 物件的show方...
IDEA 陣列作為方法引數 返回值
陣列可以作為方法的引數。當呼叫方法的時候,向方法的小括號進行傳參,傳遞進去得其實是陣列的位址值。public class demo01arrayparam printarray array system.out.println printarray array system.out.println ...
block作為類的屬性時用copy
block屬性的宣告,首先需要用copy修飾符,因為只有copy後的block才會在堆中,棧中的block的生命週期是和棧繫結的 棧 由系統維護的區域性變數 是存在棧上的,其生命週期隨函式的生命週期 堆 由程式設計師申請空間位址,由程式設計師手動釋放,生命週期受到程式設計師控制 使用retain也可...