У нас есть класс, обертывающий NSURLConnection. Он принимает блок, который он вызывает, когда заканчивает загрузку. Чтобы дать вам представление, см. ниже. Когда вы отправляете запрос, он сохраняет обратный вызов в экземпляре. Предположим, мой класс называется Request
// from Request.h
@property (nonatomic, copy) void(^callback)(Request*);
- (void) sendWithCallback:(void(^)(Request*))callback;
Мой код для использования выглядит примерно так:
Request * request = [Request requestWithURL:url];
[request sendWithCallback:^(Request * request) {
// do some stuff
}]
Мой вопрос: что блок делает с сохранением счетчика request
? Копирует/сохраняет? Обратите внимание, что я не поставил __block
перед определением.
Я только что изменил что-то важное в Request
(переключился с синхронного NSURLConnection
на асинхронный ASIHTTPRequest
), и он начал освобождаться почти сразу после отправки (заставляя методы делегата вызывать освобожденный объект). С синхронизацией NSURLConnection
этого никогда не происходило.
Я думаю, имеет смысл, что он будет освобожден с помощью async, но как мне правильно сохранить request
? Если бы я сохранил его сразу после создания, мне пришлось бы освободить его в обратном вызове, но обратный вызов не вызывается, если запрос отменен, и это приведет к утечке памяти.