OC的数据类型补充

1. Block

Block封装了一段代码,可以在任何时候执行

Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或者返回值

苹果官方建议尽量多用Block。在多线程、异步任务、集合遍历、集合排序、动画专场用的很多

Block跟函数很像:

可以保存代码

有返回值

有形参

调用方式一样

补充词汇:templates 模板、minus减法

//定义Block变量

void(^myblock)() = ^{

NSLog(@”-----------------------------”);

NSLog(@”-----------------------------”);

};

//利用Block变量调用Block内部的代码

     myblock();

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

return a+b;};

typedef  int (^MyBlock)(int , int);

Block中要掌握的东西:

1.    如何定义block变量

          Int (^sumBlock)(int , int);

          Void (^myBlock)();

2.    如何封装block代码

^(int a,int b) {

          returna-b;

    };

^() {

      NSLog(@”----------------------”)

    };

^   {

      NSLog(@”----------------------”); 

     };

 

3.    Block访问外面变量

l  Block内部可以访问外面的变量

l  默认情况下,Block内部不能修改外面的局部变量

l  给局部变量加上__block关键字,这个局部变量就可以在block内部修改

4.    利用typedef定义block类型

typedef  int (^MyBlock)(int , int);


Protocol 协议

基本用途

可以用来声明一大堆方法(不能声明成员变量)

只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明

只要父类遵守了某个协议,就相当于子类也遵守了

格式

协议的编写

@protocol 协议名称<NSObject>

//方法声明

@end

b)     某个类遵守协议

@interface 类名:父类<协议名称>

@end

3.     关键字

协议中有两个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流

@optional  不要求实现

@required  要求实现,不实现就会发出警告

4.     协议遵守协议

一个协议可以遵守其他多个协议,多个协议之间用逗号隔开

一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明

@protocol 协议名称<协议1,协议2>

@end

5.     基协议

NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它

6.    定义一个变量的时候,限制这个变量保存的对象遵守某个协议

类名<协议名称> *变量名

Id<协议名称> 变量名

例如:

NSObject <MyBlock> *obj;

Id<MyBlock>   obj;

如果没有遵守对应的协议,编译器会警告

7.    @protocol中声明的属性也可以做一个遵守协议的限制

@protocol(nonatomic,strong)类型<协议名称> *属性名;

@protocol(nonatomic,strong)id <协议名称>  属性名;

例如:

@protocol(nonatomic,strong)Dog<MyBlock> *dog

@protocol(nonatomic,strong)id <MyBlock> dog

8.    协议可以定义在其他单独.h文件中,也可以定义在某个类中

a)      如果这个协议只用在某个类中,就把协议定义在该类中

b)     如果这个协议用在很多类中,就把协议定义在单独文件中

9.    分类可以定义在单独文件.h.m文件中,也可以定义在原来类中

a)      一般情况下,都是定义在单独文件中

b)     定义在原来类中的分类,只要求能看懂语法

10.          协议的应用---代理模式