OC07block和protocol學習


一、 Block代碼塊

1.block的數據類型
作用:用來保存代碼的,在程序運行過程 保存

#import<Foundation/Foundation.h>
/*
    block:有返回值,有形參
*/
int main()
{
    //定義 此時不會被執行
       void(^myblock)()=^{//標識:^
        NSLog(@“—————————”);
    }
    //使用
    myblock();
    return 0;
}

注意

無參數的 可以省略上尖號後的小()
void(^myblock)()=^{}

2.有參的 block

int (^sumblock)(int , int)=^(int a,int b)
/*很像指向函數的指針,有點象嵌套的函數 指向函數的指針:int(*p)(int,int)=sum;*/
{
    return a+b;
}

3.typedef 定義block:避免重複定義

===指針函數

typedef int (*Sump)(int ,int);
Sump=sum;

===block

typedef int (^Sumblock)(int,int)
Sumblock b;
b=^(int a , int b){};//相當於變量賦值;注意最後的分號

4.總結

1)Blocks的定義:
int (^MySum)(int, int) = ^(int a, int b) {
    return a+b;
};
定義了一個叫MySum的blocks對象,它帶有兩個int參數,返回int。等式右邊就是blocks的具體實現
2)Block可以訪問局部變量,但是不能修改。
int sum = 10;
int (^MyBlock)(int) = ^(int num) {
    sum++;//編譯報錯
    return num * sum;
};
如果要修改就要加關鍵字:__block
__block int sum = 10;
3)調用:MyBlock(10);MySum(10,18);

二、 protocol協議

基本用途

1.可以用來聲明一大堆方法(不能聲明成員變量)
2.只要某個類遵守了這個協議,就相當於擁有這個協議中的所有方法聲明
3.只要父類遵守了某個協議,就相當於子類也遵守了

格式

協議的編寫
@protocol 協議名稱
// 方法聲明列表
@end
某個類遵守協議
@interface 類名 : 父類 <協議名稱>
@end

代碼舉例

//1.h
@protocol Myprotocal//定義一個協議
- (void)test;//等着類去實現
- (void) test2;
@end

//2.h //類 的聲明
類想遵守協議,一旦遵守,就能擁有協議的所有方法聲明

@interface Person:NSObject<Myprotocal>//遵守協議了
@end

關鍵字

約束 方法 是否一定要實現 便於程序員的交流
兩個關鍵字 @required @optional
//1.h
@protocol Myprotocal//定義一個協議
@required//不實現 只是有個警告 (默認)
- (void)test;//等着類去實現
@optional//可以不實現
- (void) test2;
@end

基協議

1.可以同時遵守多個協議,但不可以多繼承

@interface Person:NSObject<MyProtocal1MyProtocal2>//遵守協議了
    @end

2.基協議 也叫 NSObject;一個協議也可以遵守其他協議

@protocol Myprotocal<其他協議名>//Myprotocal遵守了其他協議 這樣只導入Myprotocal到類就可以了
- (void)test;//等着類去實現
- (void) test2;
@end

3.爲什麼最好要遵守基協議

因爲一些系統自動調用的方法聲明,都在基協議了 不然無法調用這些方法
爲什麼類聲明 沒有顯示寫出遵守基協議,是因爲 基類已經遵守了 ,你繼承基類 自然也就默認遵守了基協議 不要顯示寫出來了
限制對象
我要求對象保存的對象必須是遵守Myprotocal這個協議的!怎麼寫?
在類名的後加個<協議名>

1.NSObject<Myprotocal> *obj3=[[NSObject alloc] init];//錯誤,因爲NSObject沒遵守這個協議

2.NSObject<Myprotocal> *obj3=[[Person alloc] init];//可以 Person遵守了

要求obj4 保存的對象遵守協議3 並且繼承了Person

3.Person<協議3> obj4=[[Person alloc] int];//就是分配空間的類要遵守協議3 alloc前的

注意

1.@class 快速聲明一個類
  @class 類1,類2
2.@protocal 協議1  //快速引入一個協議
  在.m 中用到 在導入協議.h文件
3.一個協議交給多個類實現 時 單寫個文件
  一個協議只讓一個類實現  直接寫在類聲明文件裏就好了

協議總結

1.協議的定義
2.如何遵守協議
@interface 類名:父類名<協議名稱>
@end
協議遵守協議
@interface 協議名:<其他協議名稱>
@end
3.協議中方法聲明的關鍵字
1)@required
要求實現,不實現會有警告
2)@optional
4.定義一個變量的時候,限制這個變量保存的對象遵守某個協議
類名<協議> *變量名
id<協議> 變量名
此時如果沒遵守,編譯器會警告

5.@property 中聲明的屬性也可以用作一個遵守協議的限制
@property (nonatomic,strong)類名<協議> *屬性名
@property (nonatomic,strong)id<協議> 變量名
6.當這個協議只供一個類使用的時候,可以寫在類面。(這是設計問題) 同時分類也要有這個理念

protocol 設計模式 代理模式

1.設計錯,影響你的架構:一個人不能做的事,讓另一個人去做
2.設計原則
首先得擁有某個代理對象屬性
其次要很清楚代理有哪些方法
最後要保證能解耦
3.實現方案
定義一個protocol,在其中聲明一些和代理溝通的方法
擁有一個代理屬性id<protocol> delegate
讓代理遵守protocol
發佈了36 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章