【问题标题】:Being a good iPhone memory citizen做一个好的 iPhone 内存公民
【发布时间】:2009-11-12 03:32:40
【问题描述】:

我正在尝试从内存泄漏中清理我的代码,但我遇到了“释放”方法的问题。

这是我的代码:

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] 上面的行没有遇到同样的问题时;

【问题讨论】:

  • 贴出显示 URL 分配方式的代码?

标签: iphone memory-leaks


【解决方案1】:

由于您没有发布显示 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】:

    你负责调用release吃时间,你调用alloc、copy或retain。

    在这种情况下,您在 dict 上调用了 alloc,但是(可能,虽然它没有显示 url 的来源)不是在 url 上。

    【讨论】:

      【解决方案3】:

      Objective-C 允许您向 nil 指针发送消息(例如“释放”)而不会产生任何后果。

      如果指针不是 nil 并指向虚假的东西(即已释放的对象),您将获得 EXC_BAD_ACCESS 异常。调用release之前的url参数是从哪里来的,它的retain count([url retainCount])是多少?

      【讨论】:

        猜你喜欢
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 2011-07-07
        • 2021-06-25
        • 2012-04-11
        相关资源
        最近更新 更多