我遇到了一个我不确定如何解决的问题。让我给出一些相关的代码。
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
?
答案 0 :(得分:1)
调用者不会保留委托对象(按照惯例)。期望是在对象上设置它的调用者将保留它。建议您使用带有僵尸的仪器工具(然后使用泄漏)来查看正在发生的事情。