我们正在构建一个具有以下代码精华的自定义键盘。
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *numericButton;
for (int i = 1; i < 13; i++) {
numericButton = [UIButton buttonWithType:UIButtonTypeCustom];
int xorig, yorig;
int w = BUTTON_SIZE_W_EDG;
int tag = i;
numericButton.frame = CGRectMake(xorig, yorig + BUTTON_OFFSET, w, BUTTON_SIZE_H);
numericButton.tag = tag;
[numericButton addTarget:self
action:@selector(buttonPressed:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:numericButton];
}
}
我的问题是,将numericButton重新分配给新的UIButton是否会导致内存泄漏? buttonWithType返回一个自动释放的UIButton,但我不确定以前的numericButton是否会被这个代码释放。将声明置于for循环中会有什么不同吗?
感谢
答案 0 :(得分:1)
此代码不会泄漏。如你所说buttonWithType
返回一个自动释放的对象。由于您没有alloc
,copy
,new
或retain
,因此您不会声明对任何内容的所有权而且您不需要(自动)释放任何东西。
将声明放在循环中没有任何区别。但这是自然而然的地方。
答案 1 :(得分:1)
如果要确保自动释放的对象释放资源,可以将它们放入自动释放池中。 例如
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *numericButton;
for (int i = 1; i < 13; i++) {
@autoreleasepool {
numericButton = [UIButton buttonWithType:UIButtonTypeCustom];
int xorig, yorig;
int w = BUTTON_SIZE_W_EDG;
int tag = i;
numericButton.frame = CGRectMake(xorig, yorig + BUTTON_OFFSET, w, BUTTON_SIZE_H);
numericButton.tag = tag;
[numericButton addTarget:self
action:@selector(buttonPressed:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:numericButton];
}
}
}
如果要实例化大量自动释放对象,此方法将特别有用。