一、block
1、什么是block
block 是OC中特有的一种数据类型,它的作用就是用来保存一段代码,类似于函数
2、block和函数
从写法上来说,block的定义有些类似余指向函数的指针
eg
使用block性能更高/******指向函数的指针********/ // 定义函数sum int sum(int a, int b) { return a + b; } // 定义指向函数的指针 int (*p) (int, int); // 指向函数sum p = sum; /******定义一个block*******/ // 定义一个^myBlock int (^myBlock) (int, int); // 给block赋值 myBlock = ^(int a, int b){ return a + b; };
3、用typedef定义block
使用方法如下:
eg
// #typedef的使用 #typedef int (^MyBlock) (int, int) // 通过MyBlock定义block变量 MyBlock block1 = ^(int a, int b){ // 返回a*b return a *b; };
二、protocol(协议)
1、什么是协议
协议是用来声明方法的,一类如果遵守了某个协议,那么它将拥有协议中定义的方法的声明
2、协议的书写格式
@interface 协议名 <NSObject>
@end
其中遵守协议用<>表示
这边还有一个注意点就是,协议什么时候写在一个单独的文件中,什么时候写在类的声明中?
- 如果某个协议只在这个类使用到了,那么这个协议就声明在类的头文件中
- 如果这个协议被多个类所使用,那么这个协议就要放到单独的文件中来
3、定义变量时指定协议
NSObject类型的对象,遵守<NSCopying>协议
NSObject<NSCopying> *obje;
任何OC对象遵守<NSCoding>协议
id<NSCoding> obj2;
4、协议的应用(代理设计模式)
代理设计的理念就是有事找代理,比方说一个人要去看电影,如果要使用代理模式设计步骤如下:
- 首先得有一个代理 id *delegate
- 在这个人要做的事情中调用代理的方法
- 将代理要做的事情的声明放到协议中
- 限制定义代理对象遵守代理协议
eg:// 定义一个协议 @protocol AgentDelegate <NSObject> // 声明一个查询剩余票数的方法 - (int)inqueryTicketCount; // 声明一个查询票价的方法 - (double)inqueryTicketPrice; @end // 先定义一个代理类Agent @interface Agent :NSObject <AgentDelegate> @end // 方法实现 @implementation Agent // 查询票数 - (int)inqrueryticketcount { return 100; } // 查询票价 - (double)inqueryTicketPrice { return 500; } @end // 定义一个Person类 @interface Person :NSObject // 定义一个代理 @property (nonatomic, strong)id<AgentDelegate> delegate; // 定义一个去看电影的方法 - (bool)seeMovie; @end // Person方法的实现 @implementation Person // 看电影方法 - (bool)isSeeMovie { // 让代理查询票数 int ticketCount = [_delegate inqueryTicketCount]; // 让代理查询票价 double ticketPrice = [_delegate inqueryTicketPrice]; // 判断是否去看电影 return ticketCount > 0 && ticketPrice < 1000; } @end // int main() { // 定义一个Person对象 Person *p =[ [Persong alloc] init]; // 定义一个Agent对象 Agent *a = [ [Agent alloc] init]; // 给这个人添加一个代理 p.delegate = a; // 是否去看电影 if ([ p seeMovie]) { NSLog(@"去看电影"); } else { NSLog(@"不去看电影"); } return 0; }