【问题标题】:newbie question on iOs memory management关于 iOS 内存管理的新手问题
【发布时间】:2011-08-05 07:10:17
【问题描述】:

在这种情况下如何正确写作:

我有一些方法,返回 NSMutableArray*。因为方法不是从 init、new 或 alloc 开始的,所以在苹果内存管理指南中如何写,我返回 autorealese 对象。

-(NSMutableArray*)someMethod {

    NSMutableArray *array = [NSMutableArray alloc] init] autorealese];
    //Some code here
    return array;
}

我还有一些其他的方法,叫做这个:

-(NSMutableArray*)method1 {
     NSMutableArray *array = nil;
     if(condition){
         array = [self someMethod];
     }
     return array;
}

-(NSMutableArray*)method2 {
     NSMutableArray *array = nil;
     array = [self method1];
}

代码工作。但是 XCode 分析工具说在方法 2 中我得到了计数为 0 的对象。那么,如何编写这段代码好呢?

【问题讨论】:

    标签: iphone ios memory-management


    【解决方案1】:

    您的代码没有任何问题,除了method2 将返回自动释放的数组。因此,无论调用此方法,都应该保留返回值。

    【讨论】:

    • 是的,我保留对象,即返回方法 2。但是如果分析工具显示警告,则不能是在保留之前数组重新释放的情况?
    • 分析工具并不总是正确的。如果你运行你的应用程序并且对象没有释放,那么一切都很好。
    【解决方案2】:

    创建一个自动释放的 NSMutableArray 并返回它。

    -(NSMutableArray*)someMethod {
    
            NSMutableArray *array = [NSMutableArray alloc] init] autorealese];
            //Some code here
            return array;
        }
    

    Method1 使用来自 someMethod 的自动释放 NSMutableArray,并且在 Method1 的生命周期内,该数组不会被自动释放。这是objective-c中的内存管理规则之一,即对象在方法周期中存在。

    -(NSMutableArray*)method1 {
         NSMutableArray *array = nil;
         if(condition){
             array = [self someMethod];
         }
         return array;
    }
    

    Method2 使用仍在等待从 method1 自动释放的 NSMutableArray。请务必注意,b/c 您在方法 2 中有一个条件,该数组可能为 nil。

    -(NSMutableArray*)method2 {
         NSMutableArray *array = nil;
         array = [self method1];
    }
    

    因此,换句话说,您在方法中传递了自动释放的对象。这并没有错。你只需要记住,如果你想存储 method2 的值,你需要保留它,否则它会被自动释放。

    由于您在 method1 中的条件,分析器会抱怨 b/c 不能保证 method1 会返回一个对象,它有可能返回 nil。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多