簡體   English   中英

弱自我必要(performSelector)

[英]Is weak self necessary (performSelector)

我有一個NSObject類別來在一段時間后執行塊。 在這種情況下,我是否需要弱自我?

    __weak ViewController *weakSelf = self; 
   [self runBlockAfterDelay:0.6 block:^{

        weakSelf.someview = ...
    }];




 // Category 

- (void)runBlockAfterDelay:(NSTimeInterval)delay block:(void (^)(void))block {

    dispatch_async(dispatch_get_main_queue(), ^{

        [self performSelector:@selector(executeBlockAfterDelay:) withObject:[block copy] afterDelay:delay];
    });
}

- (void)executeBlockAfterDelay:(void(^)(void))block
{
    if (block)
        block();
}

你不僅不需要它(自己沒有對塊的強引用,所以沒有循環),如果你包含它,它可能會給你的程序帶來嚴重的錯誤。 具體來說,沒有任何東西可以阻止'self'在塊運行之前被釋放(因為弱引用的整個點是它不會阻止事件被釋放)。

只是為@ Catfish_Man的精彩描述添加更多細節:

您可以在阻止之前弱化自我,在阻止內部,您可以再次強化它以確保它不會在意外時間釋放。 在這種情況下,應該確保在釋放self之后不執行該塊。 這很難, 只要沒有創建循環保持強大是一個更安全的選擇 (如果自己持有對塊的引用,則會創建循環。)

僅供參考:如果您開始考慮信號而不是程序排序,那么使用Reactive Cocoa的最終結果可能更令人滿意:

NSTimeInterval delay = 0.3;
// The activator signal that fires after the delay and completes after it.
RACSignal *delayedActivator = [[RACSignal interval:delay] take:1];

@weakify(self)
// The command that we want to execute after the delay.
RACCommand *blockToExecute = [RACCommand command];
[blockToExecute addSignalBlock:^RACSignal *(id value) {
    @strongify(self)
    self.whatever
}];

// Wire up the command on the signal.
[delayedActivator executeCommand:blockToExecute];

乍一看可能看起來有點神秘,但信號可以讓你的生活變得更加輕松。 特別是因為如果信號與自身的生命周期相關聯,例如它是一個屬性,它將在釋放self時釋放,這樣可以確保在不需要時不執行該塊。 在這種情況下,需要弱化和強化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM