黑馬程式設計師 block 和 protocol的使用

2021-06-22 07:29:35 字數 2449 閱讀 1800

一、block

1.block 是在函式執行時,儲存的一段**。block是同函式一樣是有返回值的,並且可以帶形參。下面的例子是分別展示了無引數和有引數,有無返回值的block的具體實現

//沒有引數,沒有返回值的block的定義,且後面函式體的小括號在無引數是可以省略

void (^myblock)() = ^;

// void (^myblock)() = ^();

//block的呼叫

myblock();

//帶引數和返回值的block的定義

int (^sumblock)(int, int) = ^(int a, int b);

nslog(@"%d",sumblock(4,4));

2. 為了方便在**中定義具有相同引數和相同返回值型別的block**塊,我們可以使用typedef預處理指令首先定義乙個block型別 如:

typedef int (^myblock) (int, int);

//在**塊中的呼叫

myblock sumblock = ^(int a, int b);

3.block**塊是可以訪問block 外部的變數的,但是要修改外部的區域性變數時,必須在要訪問的區域性變數的型別前面加上__block(注意:這裡是兩個下劃線__block) 關鍵字,才可以在block**塊中進行訪問

__block int c = 7;

myblock sumblock = ^(int a, int b);

二、protocol

1.protocol 即是 協議,在協議中我們可以宣告多個方法,只要乙個類遵守了這個協議,就說明這個類具有了這個協議中的所有方法

2.協議只能宣告方法,不能實現方法,實現方法要在遵守這個協議的類中進行實現。這一點同分類不同,分類是在原有類的基礎上,宣告並實現其他方法。

//

// myprotocol.h

// block

//// created by lpmac on 14-6-1.

//#import @protocol myprotocol //@required 是要求遵守協議的類實現這個方法,不實現時只會發出警告

//@optional 不要求遵守協議的類實現這個方法

@required

- (void)test;

@optional

- (void)test2;

@end

3.person類遵守myprotocol協議

//

// person.h

// block

//// created by lpmac on 14-6-1.

//#import @protocol myprotocol; //不用import可以提高執行效率,在真正用到實現協議的時候才import即可,跟.h檔案中類的使用時的@class使用方法類似

@inte***ce person : nsobject @end

//// person.m

// block

//// created by lpmac on 14-6-1.

//#import "person.h"

#import "myprotocol.h" //在協議真正使用的時候才引用

@implementation person

- (void)test

@end

4.在main函式中呼叫 

person *p = [[person

alloc]init];

[p test];

5.乙個類可以同時遵守多個協議,兩個協議中間使用都好隔開就可以;

同時,乙個協議也可以遵守另乙個協議,這樣就和類的整合類似,遵守另乙個協議的協議具有遵守協議的所有方法宣告

@inte***ce person : nsobject @end
@protocol myprotocol
變數的遵守某個協議時,如下這樣使用:

id obj;
屬性遵守某個協議時,如下使用:

@property (nonatomic, strong) id obj;

@property (nonatomic, strong) dog*dog;

6.protocol 經常被用在**模式和觀察者模式上

7.如果在宣告乙個物件時,且該物件只能賦值為遵守某個協議的物件,那麼我們可以使用以下的語法

person*p = [[person alloc]init];

黑馬程式設計師 block

ios培訓 mac 期待與您交流!塊 block lblock封裝了一段 可以在任何時候執行 l block可以作為函式引數或者函式的返回值,而其本身又可以帶輸入引數或返回值。l 蘋果官方建議盡量多用block。在多執行緒 非同步任務 集合遍歷 集合排序 動畫轉場用的很多 1.block的定義 in...

黑馬程式設計師 Block

一 block 1.block是一種資料型別,block的標誌 2.block封裝了一段 可以在任何時候執行 3.block可以作為函式引數或者函式的返回值,而其本身又可以帶輸入引數或返回值 4.block和函式 二 block的定義 1.block的定義 return 變數表示式 2.block內...

13 黑馬程式設計師 block語法

block封裝了一段 可以在任何時候執行 block可以作為函式引數或者函式的返回值,而其本身又可以帶輸入引數或返回值。蘋果官方建議盡量多用block。在多執行緒 非同步任務 集合遍歷 集合排序 動畫轉場用的很多 blocks 的定義 int mysum int,int inta,intb 定義了乙...