Objective-C - 代理被解除分配?

时间:2011-07-31 08:51:12

标签: objective-c delegates uiviewcontroller

我有一个视图控制器,列出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 个答案:

答案 0 :(得分:3)

您希望vc成为officesRequest的委托,但是,在分配并初始化vc并将其设置为委托后,您会立即释放它。请注意,代理属性通常为assign,而非retain。然后,您负责保持您的委托对象,直到不再需要为止。因此,如果您计划在不久的将来向其发送消息,则无法立即将其发布。