2016-01-21 3 views
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]; 

В моем коде я использую оба блока и масонство. Если я использую I BlocksKit, bk_addEventHandler, есть цикл сохранения, который, я думаю, потому, что я сам сохраняю self.view, сохраняю testButton, сохраняю себя. Однако, когда я использую Mansonry самостоятельно без BlocksKit, и я использую сильное «я» в масонстве mas_makeConstraints, мне приходит в голову, что нет цикла сохранения, потому что viewController может вызывать метод dealloc. Может ли кто-нибудь объяснить мне, что в масонстве нет цикла удержания?Когда я должен использовать слабость в блоке и почему нет цикла сохранения в масонстве?

ответ

5

Это потому, что блок блока-комплект сохранил для исполнения на более позднем этапе (создавая тем самым, через ссылку на себя, то сохраняет цикл), в то время как блок кладки выполняются более или менее прямо сейчас, и затем выброшенный.

Аналогичным образом, вы никогда не должны беспокоиться о сохранении цикла, когда вы вызываете метод UIView animate.... Это связано с тем, что как только ваш код заканчивается, цикл цикла заканчивается, и блок анимации выполняется и отбрасывается. Но ссылка на self в блоке наблюдателя NSNotification может вызвать цикл сохранения, потому что он просто удерживается системой навсегда, пока вы не отмените регистрацию для этого уведомления, и пока вы сохраняете наблюдателя.

+0

Дальнейшее обсуждение: http://www.apeth.com/iOSBook/ch12.html#_unusual_memory_management_situations – matt

Смежные вопросы