2012-10-16 92 views
2

在我的課程中,我創建了這種方法。在完成塊中保留循環

-(void) refreshDatasourceWithSuccess:(CreateDataSourceSuccessBlock) successBlock 
         failure:(CreateDataSourceFailureBlock) failureBlock; 

然後我把它稱爲是這樣的:

[self refreshDatasourceWithSuccess:^(NSArray* array){ 
    //Success block 
    [self setDataSource:array]; 
    [self.tableView reloadData]; 

} failure:^(NSError* error){ 
    // failure block 
    [self showConnnectionError]; 
}]; 

這是一個保留週期,因爲我引用self完成塊內? (我沒有得到任何警告)

UPDATE:

在這種情況下,另一類我得到一個警告的保留週期

typedef void (^SetFavoriteCompletionBlock)(NSError*); 

-(void)setFavoriteFriend:(BOOL)pSetFavorite 
      completion:(SetFavoriteCompletionBlock)completionBlock 
{ 
    //.... 
    completionBlock(error); 
} 

然後在此調用我得到的警告

[self setFavoriteFriend:setFavorite 
      completion:^(NSError *error){ 
       [self.tableView reloadData]; 
      }]; 
+0

你從哪裏得到有關保留週期的警告?而且,你可以發佈你的界面嗎? –

回答

2

假設您的類中沒有用於存儲塊的變量,那麼這兩個示例都不是保留週期。該塊具有對自我的引用,但自我不保留對該塊的引用。

由於方法的命名,您會在第二種情況下得到警告。它以「set」開始,因此代碼分析器假定它正在設置你的類的一個變量。給它一個不同的名字,並且警告應該消失。

然而,它與完成塊編碼,如果你只從方法同步打電話給他們的一種奇怪的方式。因此,我懷疑你確實在某處存儲了塊,然後異步地調用它們。在這種情況下,這可能是一個保留週期,具體取決於您存儲它們的方式和位置。