什么时候应该在块中使用 weakself,为什么 Masonry 中没有循环保留?
When should I use weakself in a block, and why there is no retain cycle in Masonry?
UIButton *testButton = [[UIButton alloc] init];
[self.view addSubview:testButton];
testButton.backgroundColor = [UIColor redColor];
[testButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(@100);
make.height.equalTo(@100);
make.left.equalTo(self.view.mas_left);
make.top.equalTo(self.view.mas_top);
}];
[testButton bk_addEventHandler:^(id sender) {
[self dismissViewControllerAnimated:YES completion:nil];
} forControlEvents:UIControlEventTouchUpInside];
我在我的代码中同时使用了 BlocksKit 和 Masonry。如果使用I BlocksKit,bk_addEventHandler
,有一个retain cycle,我认为是因为self retain self.view,retain testButton,retain self。但是,当我在没有 BlocksKit 的情况下单独使用 Mansonry,并且在 Masonry mas_makeConstraints
中使用 strong self 时,我发现没有保留周期,因为 viewController 可以调用 dealloc 方法。谁能向我解释一下 Masonry 中没有保留周期?
这是因为块套件块被保留以供以后执行(因此通过对自身的引用创建了保留循环), 而砌体块现在或多或少地被执行然后被扔掉。
同样,当您调用 UIView animate...
方法时,您永远不必担心保留周期。这是因为一旦您的代码结束,运行 循环就会结束并且动画块将被执行并被丢弃。但是在 NSNotification 观察者块中对 self
的引用可能会导致保留周期,因为它只是被系统永久持有,直到您取消注册该通知,同时您正在保留观察者。
UIButton *testButton = [[UIButton alloc] init];
[self.view addSubview:testButton];
testButton.backgroundColor = [UIColor redColor];
[testButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(@100);
make.height.equalTo(@100);
make.left.equalTo(self.view.mas_left);
make.top.equalTo(self.view.mas_top);
}];
[testButton bk_addEventHandler:^(id sender) {
[self dismissViewControllerAnimated:YES completion:nil];
} forControlEvents:UIControlEventTouchUpInside];
我在我的代码中同时使用了 BlocksKit 和 Masonry。如果使用I BlocksKit,bk_addEventHandler
,有一个retain cycle,我认为是因为self retain self.view,retain testButton,retain self。但是,当我在没有 BlocksKit 的情况下单独使用 Mansonry,并且在 Masonry mas_makeConstraints
中使用 strong self 时,我发现没有保留周期,因为 viewController 可以调用 dealloc 方法。谁能向我解释一下 Masonry 中没有保留周期?
这是因为块套件块被保留以供以后执行(因此通过对自身的引用创建了保留循环), 而砌体块现在或多或少地被执行然后被扔掉。
同样,当您调用 UIView animate...
方法时,您永远不必担心保留周期。这是因为一旦您的代码结束,运行 循环就会结束并且动画块将被执行并被丢弃。但是在 NSNotification 观察者块中对 self
的引用可能会导致保留周期,因为它只是被系统永久持有,直到您取消注册该通知,同时您正在保留观察者。