Block 總結(jié)

Block 是OC的一種語法,其用法如下:

//使用block需要注意的問題:
//1.聲明block類型的屬性時,修飾的關(guān)鍵詞 copy
//2.block要避免閉環(huán)強(qiáng)引用

 1.block的聲明
 2.block的實現(xiàn)和賦值
 3.block的調(diào)用
 4.block作為函數(shù)的參數(shù)
 5.block作為函數(shù)的返回值

Swift中聲明閉包: var closure:((參數(shù)名:參數(shù)類型,參數(shù)名2:參數(shù)類型,...)->(返回值類型1,返回值類型2,...)) ={(參數(shù)名1,參數(shù)名2,...) in 閉包體 }

//如果回調(diào)只有一種或兩種情況的時候,使用block進(jìn)行回調(diào)比較方法,如果有多種回調(diào)情況的,采用協(xié)議代理

//1.聲明block的變量 : 返回值(^block變量名)(參數(shù)類型1 參數(shù)名,參數(shù)類型2 參數(shù)名); 聲明時,參數(shù)名可以省略,但是不推薦省略
 void(^blockName)(NSString * str,BOOL success);
 //省略參數(shù)的寫法:void(^blockName1)(NSString *,BOOL);
//2.block的實現(xiàn)和賦值
blockName = ^(NSString * str,BOOL success){
        //block的實現(xiàn)部分,block體
        //聲明和賦值時,block體中的代碼都不會執(zhí)行
        NSLog(@"執(zhí)行blokc體中的代碼");
    };

//3.調(diào)用block
blockName(@"bwrgrets",YES);
//4.block作為函數(shù)的參數(shù)
這個有兩種方式實現(xiàn):
  第一種:提前聲明一個Block ,然后調(diào)用
  第二種: 函數(shù)調(diào)用的時候,直接聲明和實現(xiàn)
# if true

// 第一種實現(xiàn)方式: 提前聲明一個block 函數(shù)實現(xiàn)
    int(^useBlock)(NSString *) = ^(NSString * str){
        NSLog(@"調(diào)用blokc str = %@",str);
        return 0;
    };
    //調(diào)用函數(shù)
    [self useAblock:useBlock];
#else

// 第二種實現(xiàn)方式
    [self useAblock:^int(NSString *str) {
        NSLog(@"str = %@",str);
        return  1;
    }];
#endif
//使用一個block作為參數(shù)的方法
-(void)useAblock:(int(^)(NSString * str))block{
    //回調(diào)傳遞過來的block
    block(@"sdkjhvgkew");
}
//5:block作為函數(shù)的返回值 (不經(jīng)常使用)
    // 用一個變量接受一下 函數(shù)返回值
void(^getBlock)() = [self returnABlock];
    //調(diào)用返回的block
    getBlock();


// 返回一個block 的函數(shù)
-(void(^)())returnABlock{

 /*
// 第一種方式, 定義一個block
    void(^returnBlock)() = ^{
        NSLog(@"被返回的block被調(diào)用");
    };
    return  returnBlock;

 */
    // 直接返回定義和返回
    return ^{
        //直接返回
        NSLog(@"被返回的block被調(diào)用");
    };
}
附加
//采用self.myBlock 對block屬性賦值,myBlock聲明時內(nèi)存相關(guān)的關(guān)鍵詞是 copy ,所有調(diào)用setter方法是,self對block實現(xiàn)部分進(jìn)行了一次強(qiáng)引用

//解決閉環(huán)強(qiáng)引用:讓block對當(dāng)前對象的引用變成弱引用,用一個當(dāng)前類的弱引用類型指針pName指向self,在block體中使用pName去代替self
__weak NewViewController *pName = self;
__unsafe_unretained NewViewController * p = self;
//__weak 修飾,對象被釋放之后,pName會被置為nil,不會造成野指針,比較安全,只能在ARC環(huán)境中使用
//__unsafe_unretained修飾,對象被釋放之后,p不會置為nil,會造成野指針,可能會造成程序崩潰,ARC/MRC環(huán)境中都能使用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • BLOCK block的描述: 他是類似函數(shù)指針的一個代碼塊的內(nèi)聯(lián)封裝, 他可以將一個函數(shù)體作為對象傳遞 bloc...
    Chris腦閱讀 320評論 0 0
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,276評論 9 118
  • { "Unterminated string literal.": "未終止的字符串文本。", "Identifi...
    栗子雨閱讀 7,975評論 0 3
  • 手持紅豆背西陽。 菊楓又醉秋涼。 母親雙鬢染銀霜。 鄉(xiāng)戀悠長。 近日屢言齊魯, 頻頻憶念家鄉(xiāng)。 夢中宅舍伴池塘。 ...
    魯西道童閱讀 242評論 2 2
  • 我終于等到這年夏天,陽光將萬物都涂抹上燦燦的光,碧藍(lán)的天空卻把人卷進(jìn)無盡的虛無。游樂場中人們尖叫、打鬧。笑聲像...
    絢爛的小哈閱讀 509評論 0 2