Peter Warbo
Peter Warbo

Reputation: 11700

Objective-C – Delegate is dealloced?

I have a view controller that lists some data in an UITableView. To get the data downloaded I use ASIHTTPRequest which methods I have put in another class.

In my view controller I have setup the appropriate delegates to handle the data that is being retrieved from ASIHTTPRequest. So from my view controller in - viewDidLoad I alloc and init my class that holds the ASIHTTPRequest methods like so:

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

Then in - viewDidAppear: I call [officesParser downloadOffices];

My - downloadOffices method looks like this:

- (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];
}

Everytime after calling the [officesParser downloadOffices] method I get:

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

What am I doing wrong here?

Upvotes: 2

Views: 455

Answers (1)

MiguelB
MiguelB

Reputation: 1913

You want vc to be delegate for officesRequest, however, after you allocate and initialize vc and set it to be the delegate, you immediately release it. Please note that delegate properties are usually assign, not retain. You are then responsible for keeping your delegate object in existence until no longer needed. So, if you plan to send messages to it in a near future, you can't immediately release it.

Upvotes: 3

Related Questions