用Block 进行pop和传值

来源:互联网 发布:知乎 感情 精华贴 编辑:程序博客网 时间:2024/06/05 13:27

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上的

0 0
原创粉丝点击