使用 xcode 分析器,我收到一个对象潜在泄漏的警告。这个警告令人困惑,我需要一些解释为什么我会收到这个错误。这是 mediaSources 保存指向相关对象的指针的代码:
在 .h 文件中,创建指向 MediaSources 类的指针并赋予保留属性:
@interface RootViewController : UIViewController <...>
{
...
MediaSources *mediaSources;
...
}
@property (nonatomic, retain) MediaSources *mediaSources;
.m 文件(rootViewController)中有一个可以多次调用的方法。因此,我在每个条目上释放对象并分配一个新对象。MediaSources 对象执行后台任务,所以在我知道它完成之前我不想释放它。如果我在分配类的行上使用 autoRelease,它会崩溃。:
-(void) getSelectedMediaSources
{
[self setMediaSources: nil]; // release old stuff and nilify
[self setMediaSources: [[MediaSources alloc] init]];
[self.mediaSources checkForMediaSourceUpdates];
}
同样在.m文件中,mediaSources也被合成并在dealloc中释放
@synthesize mediaSources;
...
- (void)dealloc {
...
[mediaSources release];
...
[super dealloc];
}
请解释我收到此警告的原因。我不明白怎么可能有泄漏。Dealloc 应该释放这个对象的最后一个副本。
响应 checkForMediaSourceUpdates 的代码请求。这将变得有点复杂,但以下是本质:
(void) checkForMediaSourceUpdates
{
NSString *s = [NSString stringWithFormat:@"http://www.mywebsite.com/mediaSources/%@/mediaSources.plist", countryCode];
NSURL *url = [NSURL URLWithString:s];
NSURLRequest *req = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:60.0];
MyDownloader *d = [[MyDownloader alloc] initWithRequest:req];
[self.connections addObject:d];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkForMediaSourceUpdatesDownloadFinished:) name:@"connectionFinished" object:d];
[d.connection start];
[d release];
}
-(void) checkForMediaSourceUpdatesDownloadFinished: (NSNotification *) n
{
MyDownloader *d = [n object];
NSData *data = nil;
if ([n userInfo]) {
NSLog(@"In checkForMediaSourceUpdatesDownloadFinished: MyDownloader returned an error");
}
else {
data = [d receivedData];
// do something with the data
}
}
myDownloader 类执行输入 NSURLRequest 中指定的文件下载。完成下载后,该类会生成一个名为“connectionFinished”的NSNotification。此类的用户必须注册此通知并处理此类的所有清理操作。如果下载失败,该类将生成一个 NSNotification,也称为“connectionFinished”,但添加了指示发生错误的 userInfo。同样,此类的用户必须注册此通知并处理此类的所有清理操作。