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则应该使用它.但是,对于许多/大多数用途,您不会发现两者之间存在任何重大差异.
我同意马特鲍尔.让我补充一点,如果你发现自己经常使用这种模式,那么编写一个快速类别会很方便:
@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)