我正在尝试从内存泄漏中清除我的代码,并且我遇到了'release'方法的问题。
这是我的代码:
NSArray *dict = [[NSArray alloc] initWithContentsOfURL:url];
if (dict == nil) {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Error"
message:@"Cannot retrieve content. Please try again later."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
return;
}
self.schedule = dict;
[dict release];
[url release]; //I receive a runtime error here, "BAD ACCESS"
我不明白为什么当我在[dict release]上面的行中没有遇到同样的问题时;
答案 0 :(得分:0)
您有责任致电释放进食时间,您可以拨打,复制或保留。
在这种情况下,你在dict上调用了alloc,但是(可能,虽然没有显示url来自哪里)不在url上。
答案 1 :(得分:0)
由于您没有发布显示URL创建方式的代码,因此遵循以下一般规则:
如果使用以“init”开头的初始化程序创建对象,则应该释放它。如果它是另一种方式(方便方法),那么它是自动释放的。例如:
NSArray *a = [[NSArray alloc]initWithContentsOfURL:url]; // release this later
NSArray *a = [NSArray arrayWithContentsOfURL:url]; // this will be auto released
基本上你只需要看看框架是否给你一个自动释放的对象,因为你不能发布一个自动释放的对象,否则你(显然)会崩溃。
看看Memory Management Guide。应该要求阅读。
答案 2 :(得分:0)
Objective-C允许您向nil指针发送消息(例如'release')而不会产生任何后果。
如果指针是非零并且指向某个虚假的东西(即已被释放的对象),则会得到EXC_BAD_ACCESS异常。在调用release之前,url参数来自哪里以及它的保留计数([url retainCount])是什么?