委托属性未设置?

时间:2012-03-08 00:58:38

标签: objective-c ios

我遇到了一个我不确定如何解决的问题。让我给出一些相关的代码。

FrontpageViewController(viewDidLoad)

NewsFetcher *newsFetcher = [[NewsFetcher alloc] initWithURL:url];
newsFetcher.delegate = self;
[newsFetcher loadData];

NewsFetcher.h

@property (nonatomic, unsafe_unretained) id <NewsFetcherDelegate> delegate;

我正在使用unsafe_unretained,因为我希望我的应用程序也适用于iOS 4,同时仍然使用ARC以方便使用。

NewsFetcher.m

- (id)initWithURL:(NSURL *)url {

    self = [super init];

    if (self) {

        self.url = url;
        self.receivedData = [[NSData alloc] init];
    }

    return self;
}

- (void)loadData {

    NSLog(@"%@", self.delegate); // FrontpageViewController, as expected

    NSURLRequest *request = [NSURLRequest requestWithURL:self.url 
                                             cachePolicy:NSURLRequestReloadIgnoringCacheData 
                                         timeoutInterval:15];

    if (self.connectionInProgress)
        [self.connectionInProgress cancel];

    self.connectionInProgress = [[NSURLConnection alloc] initWithRequest:request
                                                                delegate:self
                                                        startImmediately:YES];
}

一切正常。 NewsFetcher符合NSURLConnectionDelegate协议,因此被调用的下一个方法是connection:didReceiveData:。但是,当我在该方法中执行另一个NSLog(@"%@", self.delegate)时,我会得到不同的结果(EXEC_BAD_ACCESS,NSCFDictionary等)。我认为这意味着我的delegate属性指向一个已释放的对象,这很奇怪,因为它应该是仍在屏幕上的视图控制器(因此无法释放,对吧?)。

我的委托如何在一种方法中可用,但在下一种方法中不再存在?是否与unsafe_unretained

有关

1 个答案:

答案 0 :(得分:1)

调用者不会保留委托对象(按照惯例)。期望是在对象上设置它的调用者将保留它。建议您使用带有僵尸的仪器工具(然后使用泄漏)来查看正在发生的事情。