1
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循环,我认为这是因为self 保留self.view,retain testButton,retain self。但是,当我在没有 BlocksKit 的情况下单独使用 Mansonry 并且在 Masonry 中使用 strong selfmas_makeConstraints时,我突然想到没有保留周期,因为 viewController 可以调用 dealloc 方法。谁能向我解释砌体中没有保留周期?

4

1 回答 1

5

这是因为 block kit 块被保留以供以后执行(因此通过对 self 的引用创建了 retain cycle),而 masonry 块现在或多或少地执行然后被丢弃。

animate...同样,当您调用 UIView方法时,您永远不必担心保留周期。这是因为一旦你的代码结束,运行循环就结束了,动画块被执行并被丢弃。但是self在 NSNotification 观察者块中的引用可能会导致保留周期,因为它只是被系统永远持有,直到您取消注册该通知,同时您正在保留观察者。

于 2016-01-21T03:24:13.380 回答