Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 是自动释放还是马上释放更好?_Iphone_Memory Management_Uikit - Fatal编程技术网

Iphone 是自动释放还是马上释放更好?

Iphone 是自动释放还是马上释放更好?,iphone,memory-management,uikit,Iphone,Memory Management,Uikit,在很多情况下,一个人会分配一个实例,并在它被分配给其他对象后立即释放它,而其他对象会在内部保留它 比如说, UIView *view = [[UIView alloc] initWithFrame...]; [self addSubView:view]; [view release]; UIView*view=[[UIView alloc]initWithFrame…]; [自添加子视图:视图]; [查看发布]; 我听到有人建议我们使用自动释放,而不是立即释放 因此,上述内容变成: UIView

在很多情况下,一个人会分配一个实例,并在它被分配给其他对象后立即释放它,而其他对象会在内部保留它

比如说,

UIView *view = [[UIView alloc] initWithFrame...]; [self addSubView:view]; [view release]; UIView*view=[[UIView alloc]initWithFrame…]; [自添加子视图:视图]; [查看发布]; 我听到有人建议我们使用自动释放,而不是立即释放

因此,上述内容变成:

UIView *view = [[[UIView alloc] initWithFrame...] autorelease]; [self addSubView:view]; UIView*视图=[[[UIView alloc]initWithFrame…]自动释放]; [自添加子视图:视图];
这里的最佳实践是什么?利与弊?

在大多数情况下,这两种方式都无关紧要。由于
-autorelease
仅仅意味着对象将在运行循环的当前迭代结束时释放,因此对象将以任何方式释放

使用
-autorelease
的最大好处是,您不必担心方法上下文中对象的生存期。因此,如果您以后决定在上次使用对象几行之后对其执行操作,则无需担心将调用移动到
-release

使用
-release
与使用
-autorelease
相比,使用
-release
的主要实例是,如果您在方法中创建了大量的临时对象。例如,考虑以下方法:

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

        // Do something with tempObject

       i++;
    }
}
-(void)someMethod{
整数i=0;
而(i<100000){
id tempObject=[[SomeClass alloc]init]autorelease];
//用tempObject做点什么
i++;
}
}
当这个方法结束时,自动释放池中已经有100000个对象等待释放。根据
tempObject
的类别,这可能是桌面上的一个主要问题,也可能不是,但在内存有限的iPhone上肯定会出现。因此,如果您正在分配许多临时对象,您应该真正使用
-release
而不是
-autorelease
。但是,对于许多/大多数用途,你看不出两者之间有什么重大区别。

我同意。让我补充一点,如果您发现自己经常使用此模式,可以方便地编写一个快速类别:

@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
可按如下方式使用:

UIView * view = [someView addNewSubviewOfType:[UIView class]
                                      inFrame:someFrame];
它甚至可以用于其他类型,只要它们是从UIView派生的:

UIButton * button = [mainView addNewSubviewOfType:[UIButton class]
                                          inFrame:buttonFrame];

只要有可能,我通常选择自动释放而不是自动释放。这源于多年调试和增强他人Objective-C代码的经验。到处使用自动释放的代码使得在对象过度释放时调试变得更加困难,因为额外的释放发生在远离错误代码的地方

许多人在不了解cocoa内存管理的工作原理时,也会使用autorelease。学习规则,学习API,你几乎不需要自动释放一个对象


最后一点是,如果您不需要自动释放行为,那么使用自动释放只是不必要地为您的程序添加额外的工作

+1。autorelease在性能上受到了很多批评(我很少看到在正常的、非大循环代码中用数字备份的批评),但是autorelease在代码重构时也避免了很多泄漏。我确实更经常在低级例程中使用release,因为我不知道它们是否可以在更高级别的大循环中调用。但是,如果要使用release,如果变量仍在作用域中,则必须立即将变量设置为nil。永远不要释放对象,但仍然有指向它的指针。