pop
在SecVC(由RootVC push而来) 中创建一个TouchView类 继承于UIView 点击TouchView SecVC实现pop
1.给block函数类型重命名
typedef void(^MyBlock)();
2.将MyBlock设置成属性
@property (nonatomic, copy) MyBlock block;
3.重写dealloc方法
- (void)dealloc
{
// block属性的释放方式
Block_release(_block);
[super dealloc];
}
4.点击View控件 实现页面pop
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
self.block();
NSLog(@"还能打出来");
}
5.在SecVC中实现block方法
// TouchView的对象是创建在SecVC中的 SecVC一旦被pop 那么它的内存空间会释放 但此时它的子视图 也就是TouchView的实例对象的touchBegan方法还没有执行完 这样会引起崩溃 所以系统将block实现中的self.retainCount +1 于是编译器会继续跳转到touchBegan方法中 所以SecVC 和 TouchView 均无法被释放
// 在这样的情况下需要有__block修饰的 SecViewController类指针指向self的内存空间 这样 等touchBegan方法执行完以后 系统会释放SecViewController
__block SecViewController *mySelf = self;
touchView.block = ^void (){
[mySelf.navigationController popViewControllerAnimated:YES];
};
传值
传值用于不同类中
1.需要传值的类创建重命名block函数类型
2.设置成属性
3.重写dealloc方法
4.在某个方法中调用block 参数处填写自身的某个值
5.在需要值的类中实现block 用传过来的参数给自身赋值 完成传值
传值不存在pop那个问题 因为被传值的类和传值类没有直接联系 不像TouchView是添加在SecVC上的