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. 协议的应用---代理模式