黑馬程式設計師 oc block與protocol

2021-06-27 18:21:15 字數 3171 閱讀 8535

一、block

1.如何定義block變數

int (^sumblock)(int, int);

void (^myblock)();

2. 如何利用block封裝**

^(int a, int b) {

return a - b;

nslog(@"----------");

nslog(@"----------");

3. block訪問外面變數

* block內部可以訪問外面的變數

* 預設情況下,block內部不能修改外面的區域性變數

* 給區域性變數加上__block關鍵字,這個區域性變數就可以在block內部修改

4.利用typedef定義block型別

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

// 以後就可以利用myblock這種型別來定義block變數

myblock block;

myblock b1, b2;

b1 = ^(int a, int b) {

return a - b;

myblock b3 = ^(int a, int b) {

return a - b;

二、protocol

1.協議的定義

@protocol 協議名稱 

// 方法宣告列表....

@end

2.如何遵守協議

1> 類遵守協議

@inte***ce 類名 : 父類名 《協議名稱1, 協議名稱2>

@end

2> 協議遵守協議

@protocol 協議名稱 《其他協議名稱1, 其他協議名稱2>

@end

3.協議中方法宣告的關鍵字

1> @required (預設)

要求實現,如果沒有實現,會發出警告

2> @optional

不要求實現,怎樣不會有警告

4.定義乙個變數的時候,限制這個變數儲存的物件遵守某個協議

類名《協議名稱》 *變數名;

id《協議名稱》 變數名;

nsobject*obj;

idobj2;

如果沒有遵守對應的協議,編譯器會警告

5.@property中宣告的屬性也可用做乙個遵守協議的限制

@property (nonatomic, strong) 類名《協議名稱》 *屬性名;

@property (nonatomic, strong) id《協議名稱》 屬性名;

@property (nonatomic, strong) dog*dog;

@property (nonatomic, strong) iddog2;

6.協議可用定義在單獨.h檔案中,也可用定義在某個類中

1> 如果這個協議只用在某個類中,應該把協議定義在該類中

2> 如果這個協議用在很多類中,就應該定義在單獨檔案中

7.分類可用定義在單獨.h和.m檔案中,也可用定義在原來類中

1> 一般情況下,都是定義在單獨檔案

2> 定義在原來類中的分類,只要求能看懂語法

三、**模式

例ticketdelegate.h檔案

#import 

// 宣告一些跑腿方法

@protocol ticketdelegate 

// 返回票價

- (double) ticketprice;

// 還剩多少張票

- (int) leftticketsnumber;

@end

person.h檔案

#import 

#import "ticketdelegate.h"

@inte***ce person : nsobject

- (void) buyticket;

// 擁有乙個**屬性

// id代表**的類名隨便

// 但必須遵守ticketdelegate協議

@property (nonatomic, retain) iddelegate;

@end

person.m檔案

agent.h檔案

#import 

#import "ticketdelegate.h"

@inte***ce agent : nsobject 

@end

agent.m檔案

#import "agent.h"

@implementation agent

// 剩餘的票數

- (int)leftticketsnumber

// ... 親自跑電影院\或者打**

return 1;

// 每一張票多少錢

- (double)ticketprice

// ... 親自跑電影院\或者打**

return 1000;

@end

main.m檔案

#import 

#import "person.h"

#import "agent.h"

int main(int argc, const char * argv)

@autoreleasepool {

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

p.delegate = a;

[p buyticket];

return 0;

void test()

// 人

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

// **

agent *a = [[agent alloc] init];

// 設定人的**

p.delegate = a;

// 人打算看電影

[p buyticket];

[a release];

[p release];

黑馬程式設計師

asp.net android ios開發 net培訓 期待與您交流!map hashtable 底層是雜湊表資料結構,不可以存入null鍵和null值。該執行緒是同步的,jdk1.0出現,效率低。hashmap 底層是雜湊表資料結構,允許使用null鍵和null值。該集合執行緒是不同步的,將has...

黑馬程式設計師

1.了解反射 反射 就是通過class檔案物件,去使用該檔案中的成員變數,構造方法,成員方法。person p new person p.使用 要想這樣使用,首先你必須得到class檔案物件,其實也就是得到class類的物件。2.反射中的類 class類 成員變數 field類 構造方法 const...

黑馬程式設計師

黑馬程式設計師 j a基礎學習筆記2 一 筆記內容概述 關鍵字 識別符號 注釋 注釋的應用 常量 進製的由來 進製轉換 負數的進製 變數的介紹 變數的基本演示 型別提公升 強制轉換 字元型別運算過程 型別運算細節 算術運算子 賦值運算子。二 常用內容介紹 1.注釋內容不占用記憶體,即使新增再多的注釋...