Цель-C - Делегат освобожден? - PullRequest
2 голосов
/ 31 июля 2011

У меня есть контроллер представления, который перечисляет некоторые данные в UITableView. Для загрузки загруженных данных я использую ASIHTTPRequest, которые я поместил в другой класс.

В моем контроллере представления я настроил соответствующих делегатов для обработки данных, которые извлекаются из ASIHTTPRequest. Поэтому из моего контроллера вида в - viewDidLoad я выделяю и инициирую свой класс, который содержит методы ASIHTTPRequest, например:

self.officesParser = [[[OfficesParser alloc] init] autorelease]; // retained property

Тогда в - viewDidAppear: я звоню [officesParser downloadOffices];

Мой - downloadOffices метод выглядит следующим образом:

- (void)downloadOffices {

    // 1. Downloaded offices.json
    NSURL *officesUrl = [NSURL URLWithString:@"http://example.com/example.json"];
    ASIHTTPRequest *officesRequest = [ASIHTTPRequest requestWithURL:officesUrl];

    // Always ask the server if there is new content available, 
    // If the request fails, use data from the cache even if it should have expired.
    [officesRequest setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy];

    // Store the cache permanently
    [officesRequest setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];

    [officesRequest setTag:1];

    OfficesViewController *vc = [[OfficesViewController alloc] init];
    [officesRequest setDelegate:vc];
    [vc release];
    [officesRequest startAsynchronous];
}

Каждый раз после вызова метода [officesParser downloadOffices] я получаю:

*** -[OfficesViewController respondsToSelector:]: message sent to deallocated instance 0x6a2f6c0

Что я здесь не так делаю?

1 Ответ

3 голосов
/ 31 июля 2011

Вы хотите, чтобы vc был делегатом для officesRequest, однако после того, как вы выделите и инициализируете vc и установите его в качестве делегата, вы сразу же отпустите его.Обратите внимание, что свойства делегата обычно assign, а не retain.Затем вы несете ответственность за сохранение вашего объекта делегата до тех пор, пока он больше не понадобится.Поэтому, если вы планируете отправлять на него сообщения в ближайшем будущем, вы не можете сразу же выпустить его.

...