2014-02-20 5 views
5

Может ли doFirst вызвать цикл удержания здесь?Вызывает метод внутри блока, который вызывает другой метод, ссылающийся на self, вызывает цикл сохранения?

@interface Example : NSObject 
@property (nonatomic, strong) void (^block)(); 
@end 

@implementation Example 

- (void)doFirst 
{ 
    __weak id weakSelf = self; 
    self.block =^{    
     [weakSelf doSecond]; 
    }; 

    self.block(); 
} 

- (void)doSecond 
{ 
    self.value = //... 
    // do other stuff involving self 
} 
@end 
+0

Полезный совет при упоминании слабого сафа заключается в том, чтобы сделать что-то вроде этого: '__weak typeof (self) weakSelf = self'. Делает вещи проще при повторном использовании кода в разных местах и ​​т. Д. – liamnichols

ответ

5

В отличие от блоков методы не являются объектами; они не могут хранить постоянную ссылку на объекты.

Ваш код не приведет к циклу удержания. Тот факт, что код внутри doSecond ссылок self явно не означает, что self получит дополнительное время. Когда ваш блок вызывает doSecond, его self исходит из ссылки weakSelf внутри doFirst.

Примечание: Когда вы храните блоки как свойства, use (nonatomic, copy) вместо (nonatomic, strong).

+0

Почему «копировать» и «сильные» здесь? Он создан и принадлежит классу «Example», не предоставленному другим классом. AFAIK, разве это не добавит лишних накладных расходов при создании блока? –

+0

Независимо от семантики 'copy' vs' strong', это четкий ответ и имеет большой смысл, особенно в отношении 'методов не являются объектами'. +1. Благодарю. –

+1

@ JRG-Developer Вам нужна копия для блоков, созданных в стеке. В коде, который вы показываете, это не имеет значения, потому что вы вызываете блок перед выходом из метода, в котором он определен. Однако, если вы хотите, чтобы блок оставался вокруг, вам нужно сделать его копию до выхода метода. – dasblinkenlight

0

No Это не будет. Потому что он просто указывает на метод, который не будет содержать то, что внутри методов, которые просто ссылаются как на объект.

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