之后自动释放或释放更好吗?

Boo*_*oon 9 iphone memory-management uikit

在很多情况下,人们会分配一个实例,并在将其分配给其他内容后立即释放它,并在内部保留它.

例如,

UIView *view = [[UIView alloc] initWithFrame...];
[self addSubView:view];
[view release];

我听说有人建议我们自动释放而不是立即释放.

所以上面变成了:

UIView *view = [[[UIView alloc] initWithFrame...] autorelease];
[self addSubView:view];

这里的最佳做法是什么?优点和缺点?

Mat*_*all 14

在大多数情况下,无论哪种方式都无关紧要.由于-autorelease简单地表示对象将在运行循环的当前迭代结束时释放,因此对象将以任一方式释放.

使用的最大好处-autorelease是您不必担心方法上下文中对象的生命周期.因此,如果您稍后决定要在对象上次使用后对某个对象执行某些操作,则无需担心将调用移至-release.

如果您在方法中创建了大量临时对象,则-release使用时的主要实例与使用相比会产生显着差异.例如,请考虑以下方法:-autorelease

- (void)someMethod {
    NSUInteger i = 0;
    while (i < 100000) {
        id tempObject = [[[SomeClass alloc] init] autorelease];

        // Do something with tempObject

       i++;
    }
}
Run Code Online (Sandbox Code Playgroud)

到这个方法结束时,你有100,000个对象坐在自动释放池中等待释放.根据类别tempObject,这可能是也可能不是桌面上的主要问题,但它肯定会在内存受限的iPhone上.因此,如果要分配许多临时对象-release,-autorelease则应该使用它.但是,对于许多/大多数用途,您不会发现两者之间存在任何重大差异.

  • +1.自动释放对性能有很大的影响(我很少看到在正常的非大循环代码中备份数字),但是当代码被重构时,自动释放也可以节省大量的泄漏.我确实在低级例程中更频繁地使用release,因为我不知道它们是否可以在更高级别的大循环中调用.但是,如果你打算使用release,那么如果变量仍在范围内,你必须立即将变量设置为nil.永远不要释放一个对象,但仍然有一个指向它的指针. (3认同)

e.J*_*mes 5

我同意马特鲍尔.让我补充一点,如果你发现自己经常使用这种模式,那么编写一个快速类别会很方便:

@interface UIView (MyCategories)
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame;
@end

@implementation UIView (MyCategories)
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame
{
    UIView * newView = [[viewType alloc] initWithFrame:frame];
    [self addSubView:newView];
    return [newView autorelease];
}
@end
Run Code Online (Sandbox Code Playgroud)

可以使用如下:

UIView * view = [someView addNewSubviewOfType:[UIView class]
                                      inFrame:someFrame];
Run Code Online (Sandbox Code Playgroud)

它甚至适用于其他类型,只要它们来自UIView:

UIButton * button = [mainView addNewSubviewOfType:[UIButton class]
                                          inFrame:buttonFrame];
Run Code Online (Sandbox Code Playgroud)