1、block属性保存
.h文件中定义属性
//模型中触发时做的事情
@property (nonatomic, strong) void(^block)();
controller中引入模型.h文件
// 创建模型
Model *item1 = [Model itemWithTitle:@"打电话"];
item1.block = ^{
NSLog(@“要做的事情”);
};
若有多个Model存入数组区分不同的Model
在按钮或其表格点击事件中触发block
// 把要做的事情(代码)保存到模型
Model *item = self.items[indexPath.row];
if (item.block) {
item.block();
}
2、block取代delegate反向传值
对比delegate:
FirstController中跳入SecondController并反向传值
SecondController.h中语法
@class SecondController;
@protocol SecondControllerDelegate <NSObject>
@optional
// 设计方法:想要代理做的事情
- (void)modalViewController:(SecondController *)modalVc sendValue:(NSString *)value;
@end
@interface SecondController : UIViewController
@property (nonatomic, weak) id<SecondControllerDelegate> delegate;
@end
SecondController.m中点击事件触发delegte方法
// 传值给FirstController
if ([_delegate respondsToSelector:@selector(modalViewController:sendValue:)]) {
[_delegate modalViewController:self sendValue:@"123"];
}
FirstController.m遵守协议ModalViewControllerDelegate
modalVc.delegate = self;
#pragma mark - ModalViewControllerDelegate
// 传值给ViewController
- (void)modalViewController:(ModalViewController *)modalVc sendValue:(NSString *)value
{
NSLog(@"%@",value);
}
使用block
SecondController.h中添加block属性:
@property (nonatomic, strong) void(^block)(NSString *value);
SecondController.m中点击时间触发
if (_block) {
_block(@"123");
}
FirstController.m中引用block实现反向传值:
SecondController *Vc = [[SecondController alloc] init];
Vc.block = ^(NSString *value) {
NSLog(@"%@",value);
};
block是一个对象
判断当前文件是MRC,还是ARC
1.dealloc 能否调用super,只有MRC才能调用super
2.能否使用retain,release.如果能用就是MRC
ARC管理原则:只要一个对象没有被强指针修饰就会被销毁,默认局部变量对象都是强指针,存放到堆里面
MRC开发常识:1.MRC没有strong,weak,局部变量对象就是相当于基本数据类型
2.MRC给成员属性赋值,一定要使用set方法,不能直接访问下划线成员属性赋值
总结:只要block没有引用外部局部变量,block放在全局区
MRC:管理block只要Block引用外部局部变量,block放在栈里面.block只能使用copy,不能使用retain,使用retain,block还是在栈里面
ARC:管理block 只要block引用外部局部变量,block放在堆里面block使用strong.最好不要使用copy
block造成循环利用:Block会对里面所有强指针变量都强引用一
使用修饰符__weak typeof(self) weakSelf = self;避免循环引用
方法中使用带返回值参数的block
Function.h
@property (nonatomic, assign) NSInteger result;
- (void)cacultor:(NSInteger(^)(NSInteger result))cacultorBlock;
Function.m
- (void)cacultor:(NSInteger (^)(NSInteger))cacultorBlock
{
if (cacultorBlock) {
_result = cacultorBlock(_result);
}
文件中使用Function.h
// 创建方法管理者
Function *mgr = [[Function alloc] init];
[mgr cacultor:^(NSInteger result){
result += 5;
result += 6;
result *= 2;
return result;
}];
NSLog(@"%ld",mgr.result);
block返回值链式编程
@property (nonatomic, assign) int result;
- (Function *(^)(int))add;
- (Function *(^)(int))add
{
return ^(int value){
_result += value;
return self;
};
}
文件中引用:
Function *mgr = [[Function alloc] init];
mgr.add(5).add(5).add(5).add(5);
NSLog(@"%d",mgr.result);