数据类型Block
block本质:指向函数的指针
block跟函数差不多,区别在于block并不确定,可以在运行时随时随地编写
代码中定义一个block:
无形参无返回值:
void (^myblock) (); //定义了一个block类型的myblock
有形参有返回值:
int (^sumblock)(int,int); //定义了一个传入两个int形参和返回int类型的block类型的sumblock
block封装代码:
//封装无参数的代码
^{
NSLog(@”--------------------”);
};
//封装有参数的代码
^(int a,int b){
return a+b;
};
完整写法:
//不带参数的block
void (^myBlock) ()=^{
NSLog(@”--------------------”);
};
//带参数的block
int(^sum)(int,int)= ^(int a,int b){
return a+b;
};
block调用:
myblock(); //调用myblock
int a=sumblock(5,4); //调用sumblock并把block的返回值赋值给a
Block知识点:
- 能访问程序中外面变量,但默认情况下不能修改外部局部变量,加上双下划线_ _block关键字即可修改外面局部变量,如:_ _block int a;
- 利用typedef自定义Block类型
//定义了一个sumBlock类型,这个类型传入两个形参并返回两者之和 typedef int (^sumBlock) (int,int); //用sumBlock定义s并封装代码 sumBlcok s=^(int a,int b){ return a+b; } //调用sumBlock int a=s(5,10);
协议protocol
协议的定义
@protocol 协议名 <NSObject>
方法声明列表….
@end
如何遵守协议
- 类遵守协议
@interface 类名:父类名 <协议名1,协议名2>
@end
- 协议遵守协议
@protocol 协议名称 <其他协议名称1,其他协议名称2>
@end
协议中方法声明的关键字
- @required (不写即默认为required)
要求实现声明的方法,如果不实现,会发出警告
- @optional
不要求实现
定义一个变量的时候,限制这个变量保存的对象遵守某个协议
-
类名<协议名称> *变量名;
-
id <协议名称> 变量名;
如:NSObject<MyProtocol> *obj;
如果不遵守协议,会严重警告
@property中声明的属性也可用做一个遵守协议的限制
-
@property (nonatomic,strong) 类名<协议名称> *属性名
-
@property (nonatomic,strong) id<协议名称> *属性名
协议可定义在单独.h文件中,也可定义在某个类中
使用情景:
如果这个协议只用在某个类中,应该把协议定义在该类中
如果这个协议用在多个类中,应该把协议定义在单独文件中
分类也可定义在单独.h和.m文件中,也可定义在该类中
使用情景:
一般情况下,都是定义在单独文件中
定义在原来类中的分类,知道语法可行即可