成为一名优秀的iPhone内存公民

时间:2009-11-12 03:32:40

标签: iphone memory-leaks

我正在尝试从内存泄漏中清除我的代码,并且我遇到了'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]上面的行中没有遇到同样的问题时;

3 个答案:

答案 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])是什么?