2016-01-26 65 views
2

我有一項服務,目前正在爲其編寫單元測試。代碼正常工作,但我收到了一個奇怪的保留週期警告。在Xcode的單元測試中出現奇怪的保留週期警告

[self.myService doSomethingCoolWithCompletionBlock:^(MyResponseObject *obj) { 
    XCTAssertNil(obj, @"obj should be nil"); 
}]; 

XCTAssertNil(obj, @"obj should be nil");線示出了在Xcode Capturing 'self' strongly in this block is likely to lead to a retain cycle警告。

如果我的代碼更改爲以下,警告被刪除:

__weak MyService *weakService = self.myService; 
[weakService doSomethingCoolWithCompletionBlock:^(MyResponseObject *obj) { 
    XCTAssertNil(obj, @"obj should be nil"); 
}]; 

我在其他單元測試使用self.someService,和從未有過這個問題。任何人都經歷過這個?

編輯

我有了以下的另一項測試:

[self.myService doSomethingElseCoolWithCompletionBlock:(NSArray *results) { 
    XCTestAssertNotNil(results, @"results should not be nil"); 
}]; 

這不會給我一個警告。我看到的唯一區別是這是檢查數組,而另一個是檢查特定類型的對象。

回答

3

斷言它是宏並在裏面使用自己。 因此您需要使用名稱self創建局部變量。

__weak id weakSelf = self; 
self.fooBlock = ^{ 
    id self = weakSelf; 
    XCTAssert(YES); 
}; 
+0

謝謝,這似乎已經解決了警告。仍然沒有解釋爲什麼在其他測試中沒有顯示其他NSAssert的警告。你能進一步闡述一下嗎? – Taz

+0

我嘗試了,但是在這個時候我的英語不允許我說出我的全部想法(對不起)。在這種情況下,您可以使用塊(myService retain block,self retain myService)並在內部使用assert。斷言它是一個宏(#define),這個宏將在編譯時粘貼到代碼中。所以你的街區裏面有自我。並將關係= self - > myService - > block - > self。可能是其他測試有沒有這種關係? – ajjnix

+0

謝謝。這就說得通了。我已經添加了另一個我沒有發出警告的測試的例子。有任何想法嗎? – Taz