Блоки не будут автоматически сохранять или копировать аргументы объекта.Это та же семантика, что и при передаче аргументов объекта методам или функциям - блок, метод или функция должны сохранять свои аргументы, если существует вероятность истечения текущего пула автоматического выпуска до того, как блок, метод или функция завершат использование аргументов.
Обратите внимание на рабочий процесс в вашем сценарии.Этот код:
Request * request = [Request requestWithURL:url];
[request sendWithCallback:^(Request * request) {
// do some stuff
}];
еще не выполняет блок и не передает никаких аргументов блоку.Он создает блок и передает его в качестве аргумента -sendWithCallback:
.Блок имеет параметр с именем request
типа Request *
, но фактический аргумент еще не был передан.
В какой-то момент в вашем коде, и предполагается, что вы сохранили блок в callback
этот блок будет называться:
callback(someRequest); // or callback(self);
или
self.callback(someRequest); // or self.callback(self);
или
aRequest.callback(someRequest); // or someRequest.callback(someRequest);
в зависимости от того, кто отвечает за его вызов.На этом этапе тот, кто вызывает обратный вызов, должен иметь ссылку на действительный запрос (someRequest
), и этот запрос является аргументом, передаваемым блоку.