2014-06-26 87 views
2

我需要在兩個塊來執行相同的一串代碼(我使用ARC)自:使用方法裏面塊

__weak typeof(self) weakSelf = self; 
[_dataProvider doA:^(NSError *error) { 
    [weakSelf handleError:error]; 
}]; 

而且在不同的地方,我呼籲:

__weak typeof(self) weakSelf = self; 
[_dataProvider doB:^(NSError *error) { 
    [weakSelf handleError:error]; 
}]; 

然後我有我的處理程序:

- (void)handleError:(NSError *)error { 
    [self.refreshControl endRefreshing]; 
    [self.tableView reloadData]; 
} 

難道這樣使用它嗎?請注意0​​方法裏面使用self。如果沒有,那麼這裏有什麼合適的方法?順便說一句:self是一個viewController,可以處理(doB:和doA:塊基於網絡,所以可能會很慢)。

+0

你是怎麼說_is可以安全使用_?它不會吹你的設備...所以,是的,在這個觀點是安全的。 – holex

+0

它不是「完全」安全的,請參閱我的答案。 – samir

回答

2

這樣做是不安全的,即使許多人這樣做。

當它被證明合適時,你應該使用帶有「weakSelf」模式的模塊。 在您的示例中,「weakSelf」模式不合理,因爲self沒有任何strongblock的引用。你可以使用這樣的:

[_dataProvider doA:^(NSError *error) { 
    // here you can use self, because you don't have any strong reference to your block 

    [weakSelf handleError:error]; 
}]; 

使用「weakSelf」模式,如果你有一個strong引用您的block(與屬性或例如一個實例變量)和您正在捕獲selfblock,例如內:

@property(strong) void(^)(void) completionBlock; 
.... 

__weak typeof(self) weakSelf = self; 

    self.completionBlock = ^{ 
     // Don't use "self" here, it will be captured by the block and a retain cycle will be created 
     // But if we use "weakSelf" here many times, it risques that it will be nil at the end of the block 
     // You should create an othere strong reference to the "weakSelf" 
     __strong typeof(self) strongSelf = weakSelf; 
     // here you use strongSelf (and not "weakSelf" and especially not "self") 
    }; 
+0

我聽到類似的話。然而,據我瞭解,xCode不同意這一點 - '[_someInstance doC:^(NSError * error){self.index + = 5; }];'(其中'@property(nonatomic,assign)NSInteger index;')。 XCode聲稱'在這個區塊強烈捕捉'自我'可能會導致一個保留週期。我對這個街區既沒有房產也沒有伊維爾,爲什麼我會收到警告? – Vive

+0

我會做沉默的警告:鏗鏘的#pragma診斷推 的#pragma鐺診斷忽略「-Warc-保留週期」 ....你這裏塊 的#pragma鐺診斷彈出 – samir

+0

所以你聲稱這是一般性警告,我不應該在這個特定的情況下關心它?我通常會發現警告有幫助,恐怕警告會隱藏一些「真相」。但是,如果你確定在這種情況下沒問題,那麼我瞭解它的工作原理。 – Vive