2016-01-26 2 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 в других модульных тестов, и никогда не было этой проблемы. Кто-нибудь испытал это раньше?

EDIT

У меня есть еще один тест, который имеет следующее:

[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 сохранить блок, self сохранить myService) и использовать assert внутри. Утвердить, что это макросы (#define), и это макросы будут вставлять код во время компиляции. Таким образом, ваш блок внутри себя. И будет отношение = self -> myService -> block -> self. Может быть, другие тесты не связаны с этим? – ajjnix

+0

Спасибо. В этом есть смысл. Я добавил пример другого теста, который у меня есть, который не бросает предупреждение. Есть идеи? – Taz

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