Я начинаю интегрировать libextobjc (https://github.com/jspahrsummers/libextobjc) в свое приложение iOS, прежде всего, для использования EXTScope @strongify
и @weakify
, но несколько вопросов, прежде чем переходить слишком глубоко в процесс.
Вот пример, который преднамеренно чрезмерно-сложный, чтобы попытаться понять, как справиться с этим:
- (void)someMethod {
if (self.someBOOL) {
_someObjectInstanceVar = [Object objectWithCompletionHandler:^{
// self reference #1
if (self.someProperty) {
// self reference #2
[[Async HTTPRequest] sendAWithID:self.property.id completionHandler:^(void (^)(NewObject *newObject) {
// self reference #3
[self showViewWithObject:newObject handler:^{
// self reference #4
[self reloadData];
}];
}];
}
}];
else {
[[Async HTTPRequest] sendBWithID:self.property.id completionHandler:^{
// self reference #5
[self reloadData];
}];
}
}
Я понимаю, что если я хочу сделать что-либо вроде асинхронного HTTP-запроса, а внутри справки self-обработчика завершения, например [self reloadData]
, мне не нужно ничего делать с сильным/слабым, поскольку сам блок запроса isn сохраняя блок завершения, поэтому нет проблем с циклами сохранения. В приведенном выше примере кода я думаю, что # 5 - это случай, когда циклы сохранения не являются проблемой.
Основная проблема - все объекты, которые принимают блок как параметр property/init, которые внутренне удерживают свойства блока. Внутри метода objectWithCompletionHandler
, где someObject
удерживается в блоке completeHandler как переменная экземпляра, есть несколько ссылок на self, которые, как я знаю, вызовут утечку. Мой главный вопрос в таком случае, как вам нужно обрабатывать weakify
и strongify
, чтобы сделать его "более безопасным"? Достаточно ли одного вызова @weakify и @strongify, как показано ниже:
- (void)someMethod {
@weakify (self);
_someObjectInstanceVar = [Object objectWithCompletionHandler:^{
@strongify(self);
...
}
Будет ли приведенная выше ссылка @strongify(self)
достаточной для использования для самостоятельных ссылок # 1, 2, 3 и 4, или мне нужно (и даже работать) получить новую слабую/сильную ссылку для использования внутри sendAWithID
и вложенный reloadData
?
РЕДАКТИРОВАТЬ: исправленный код, чтобы вопрос стал более понятным и исправить некоторые синтаксические ошибки.