Сетевой запрос авто-релиза Obj-C выпущен до завершения - PullRequest
1 голос
/ 04 февраля 2012

У меня есть класс-оболочка, построенный вокруг сетевого запроса. давайте назовем это «WrapperNetworkRequest»

Причина, по которой я обертываю это, заключается в том, что я обрабатываю ответ JSON, когда он возвращается Затем, используя протокол WrapperNetworkRequestDelegate, верните ответ делегату.

Проблема, с которой я столкнулся, заключается в том, что при использовании класса WrapperNetworkRequest в качестве объекта с автоматическим выпуском он автоматически освобождается до завершения сетевого запроса.

Я придумал, как мне кажется, ужасную идею ([самоудержание] + [самоосвобождение] в подходящее время)

Любые идеи о том, как правильно справиться с этим / Что я делаю не так? Спасибо

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012

Вместо того, чтобы ваш WrapperNetworkRequest сохранял себя в своих NSURLConnectionDelegate методах реализации, пусть его делегат принимает на себя ответственность. Один из возможных способов сделать это:

@interface Foo : NSObject <WrapperNetworkRequestDelegate>
@property (nonatomic, retain) WrapperNetworkRequest * wrappedRequest;

@end

@implementation Foo
@synthesize wrappedRequest;

//....

- (void)bar
{
    WrapperNetworkRequest * request = [WrapperNetworkRequest aNewAutoreleasedRequest];
    request.delegate = self;
    self.wrappedRequest = request; // Foo instance assumes ownership

    [request goGetData];
}

//....

@end
0 голосов
/ 04 февраля 2012

Сохранение self - совершенно нормальная идея, когда вам нужно продлить срок службы объекта. Как именно вы это делаете, это другой вопрос: вы можете сделать [self retain] или вы можете добавить self в общий сохраняющий массив, сохраняя все объекты данного вида. Подумайте NSOperationQueue. После добавления объекта операции в очередь вы можете безопасно отменить операцию, поскольку, добавив его в очередь, вы передали право собственности на операцию в очередь.

...