У меня есть служба, в которой я сейчас пишу модульный тест. Код работает так, как ожидалось, но я получаю предупреждение о странном сохранении цикла.Предупреждение о странном сохранении в модульных тестах в 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");
}];
Это не дает мне предупреждение. Единственное различие, которое я вижу, это проверка массива, а другая проверка объекта определенного типа.
Спасибо, это, похоже, устранило предупреждение. Все еще не объясняет, почему предупреждение не отображается для других NSAssert в других тестах. Можете ли вы подробнее остановиться? – Taz
Я стараюсь, но мой английский в это время не позволяет мне говорить мою полную мысль (извините). В этом случае вы используете блок (myService сохранить блок, self сохранить myService) и использовать assert внутри. Утвердить, что это макросы (#define), и это макросы будут вставлять код во время компиляции. Таким образом, ваш блок внутри себя. И будет отношение = self -> myService -> block -> self. Может быть, другие тесты не связаны с этим? – ajjnix
Спасибо. В этом есть смысл. Я добавил пример другого теста, который у меня есть, который не бросает предупреждение. Есть идеи? – Taz