其实block是苹果官方强烈推荐,比代理好使。
那么我们要定义block怎么做?
1、简单定义block
(1)有形参
int (^myBlock)(int, int);
(2)无形参
// 没有形参的无返回值block
void (^myBlock)();
2、利用block封装一段代码
(1)有形参
^(int a, int b){
return a + b;
}
(2)无形参
^(){
NSLog(@"------");
}
(3)无形参可以省略括号
^{
NSLog(@"------");
}
3、如何在block中访问外部变量
int a = 20;
__block int b = 100;
// 定义一个block
void (^myBlock)();
// 封装一段代码
myBlock = ^{
// 默认情况下可以访问外面变量的值,但是无法改变a的值
// 如果想要改变外面的变量值,可以在变量前加上__block
b = 20;
}
// 执行block
myBlock();
4、可以使用typedef定义block
//有时候频繁使用block可以使用typedef来定义block
typedef int (^myBlock)(int a, int b);
// 利用类型,定义
myBlock block;
myBlock b1, b2;
// 可以利用类型直接赋值
b1 = ^(int a, int b){
return a + b;
};
myBlock b3 = ^(int a, int b){
return a * b;
};
protocol<协议>
用来声明一大堆方法(不能声明成员变量)
只要某个类遵守了这个协议,那么就拥有这个协议中的所有方法
只要父类遵守了某个协议,相当于子类也遵守了。
协议只有一.h文件,分类是有.h和.m文件
协议格式
@protocol 协议名称 <NSObject>
- (void)test;
@end
某个类遵守协议
// 继承 : // 遵守协议<>
@interface 类名 :父类 <协议名称>
@end
协议中的几个关键字
// 如果什么都不选,那么默认是@required,必须实现
@required // 必须实现
@optional // 可选的,不要求实现
基协议
NSObject是最基本的类,任何其他类都要继承它
<NSObject>是基协议,它中声明了很多方法,比如retain/release/description,
每一个新的协议都要遵守NSObject这个基协议
以后写一份协议,一定要遵守<NSObject>
变量保存对象遵守协议
定义一个变量,限制这个变量保存的对象也遵守某个协议
类名<协议名称> *变量名
SYCar <MyProtocol> *obj;
id<协议名称> 变量名
id <MyProtocol> oc;
声明属性遵守协议
在@property中声明属性也可以遵守协议来限制
@property (nonatomic, strong) 类名<协议名称>*属性名
@property (nonatomic, strong) Car <MyProtocol> *car
@property (nonatomic, strong) id <MyProtocol> car2;
开发注意点:
如果一个协议,只有一个类去遵守的话,写在类声明文件即可
如果一个协议,有多个类去遵守,那么写在外面。
分类也可以定义在单独的.h.m文件,也可以定义在原来类中。
1>一般情况下都是定义在单独文件(开发一般就是常用这种)
2>定义在原来类中的分类。
协议代理设计
我们通过代理可以达到一些自己无法处理的事情。
Paste_Image.png Paste_Image.png Paste_Image.png代理中执行方法:
Paste_Image.png
一定要注意耦合性
所以代理必须要有协议,只有通过遵守协议,实现协议中的方法达到解决耦合性这个问题
1、生成代理协议
Paste_Image.png
2、谁成为代理谁遵守协议
Paste_Image.png
3、实现代理协议方法
Paste_Image.png
4、顺利解耦
Paste_Image.png
5、
网友评论