一、 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<MyProtocal1,MyProtocal2>//遵守協議了
@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