【发布时间】:2012-10-02 18:39:20
【问题描述】:
我在以下使用 GCD 的代码中有泄漏。注意:我没有使用 ARC。泄漏恰好在
__block NSMutableArray *newImages = [NSMutableArray new];
dispatch_async(serialQueue, ^{
for (NSDictionary *imageData in results) {
NSURL *url = [NSURL URLWithString:[imageData objectForKey:@"url"]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSError *error = nil;
NSHTTPURLResponse *response = nil;
NSData *imageData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (error == nil && imageData != nil && response.statusCode == 200) {
UIImage *image = [UIImage imageWithData:imageData];
[newImages addObject:image];
}
else {
self.errorLabel.text = @"An error has occured downloading some images.";
[self.spinner stopAnimating];
}
}
});
根据仪器,我正在泄漏:[newImages addObject:image];。为什么会这样泄漏? newImages 是一个自动释放的对象,如上所示。
【问题讨论】:
-
您使用的是什么版本的 XCode/Instruments?
-
顺便说一句,这里根本没有理由在
newImages上使用__block。__block仅用于能够分配给块内的变量,或者能够从块内看到以后对外部变量的分配。newImages永远不会被分配给除非它被初始化,在块之前。
标签: objective-c ios memory-management objective-c-blocks grand-central-dispatch