其实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;
};
用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,那么就拥有这个协议中的所有方法 只要父类遵守了某个协议,相当于子类也遵守了。 协议只有一.h文件,分类是有.h和.m文件
@protocol 协议名称 <NSObject>
- (void)test;
@end
某个类遵守协议
// 继承 : // 遵守协议<>
@interface 类名 :父类 <协议名称>
@end
// 如果什么都不选,那么默认是@required,必须实现
@required // 必须实现
@optional // 可选的,不要求实现
NSObject是最基本的类,任何其他类都要继承它 <NSObject>是基协议,它中声明了很多方法,比如retain/release/description, 每一个新的协议都要遵守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>定义在原来类中的分类。
我们通过代理可以达到一些自己无法处理的事情。
代理中执行方法:
一定要注意耦合性 所以代理必须要有协议,只有通过遵守协议,实现协议中的方法达到解决耦合性这个问题
1、生成代理协议
2、谁成为代理谁遵守协议
3、实现代理协议方法
4、顺利解耦