2010-04-09 72 views
1

我有点担心在iPhone上构建大量的自动释放对象。我的应用程序只是简单,所以它不应该是一个问题,但我只是想检查方法(如下面)是正确的和可接受的iPhone,内存/自动释放对象

-(NSNumber *)numberFromCore { 
    NSNumber *removedNumber = [[dataCore objectAtIndex:0] retain]; 
    [dataCore removeObjectAtIndex:0]; 
    return [removedNumber autorelease]; 
} 

-(NSString *)coreSizeAsString { 
    NSString *coreSize = [NSString stringWithFormat:@"%d", [dataCore count]]; 
    return coreSize; 
} 

如果可能的话我已经使用[[Class alloc] init][Class release],但我也应该希望改变上述的便捷方法。

加里

+1

自动释放池在事件循环的每个循环都清空,所以长期累积自动释放对象没有任何问题。如果你在一个循环中分配了很多对象,你可以像@Giao说的那样创建/排除你自己的池。 – 2010-04-09 15:31:02

+0

啊,这解释了很多我正在查看所有锅炉板代码试图找到autorelease池设置的位置。 – fuzzygoat 2010-04-09 15:43:28

回答

0

如果你担心大量的自动释放的对象,你进入一个循环之前创建一个NSAutoReleasePool。循环完成后,-drain池。这将尽量减少自动释放对象的时间。

+0

这将在iPhone上发布,因为它没有GC。 – jlehr 2010-04-09 15:36:26

+0

'-drain'在GC环境下可以更好地发挥作用;它更有意为将来验证代码。文档建议使用'-drain'而不是'-release'。 – Giao 2010-04-09 16:05:12

2

便捷方法就像你所显示的方法应该返回不属于调用者的对象,在这两种情况下都意味着自动释放对象,所以你的代码是正确的。