方法removeFromSuperView如何工作? 我的记忆问题不好访问时,我想重新初始化视图内存管理
- (id)init {
if (!(self = [super init]))
return nil;
_mainView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
NSLog(@"retainCount :%d", [_mainView retainCount]);
UIButton *reInitButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0f,0.0f,90.0f,35.0f)];
[reInitButton addTarget:self action:@selector(buttonDidTapped:) forControlEvents:UIControlEventTouchUpInside];
[[self view] addSubView:_mainView];
NSLog(@"retainCount :%d", [_mainView retainCount]);
[_mainView release];
NSLog(@"retainCount :%d", [_mainView retainCount]);
return self;
}
- (void)buttonDidTapped:(id)sender {
[_mainView removeFromSuperView]; //crash during second times press the button
NSLog(@"retainCount :%d", [_mainView retainCount]);
_mainView = [[UIView alloc] initWithFrame[[UIScreen mainScreen] bounds]];
[[self view] addSubView:_mainView];
NSLog(@"retainCount :%d", [_mainView retainCount]);
[_mainView release];
NSLog(@"retainCount :%d", [_mainView retainCount]);
}
我的NSLog每一个时代有任何保留或页头或释放关键字。结果非常奇怪。
//init
retainCount : 1
retainCount : 2
retainCount : 1
//1st time pressed button
retainCount : 1 //remove super view didn't decrease
retainCount : 2
retainCount : 1
//2nd time pressed button
retainCount : 0 //crash. Memory bad access
奇怪的是它为什么没有在第一次按下时崩溃?
+1在这种情况下设置为零。 – 2011-05-15 05:33:51
请注意,将release释放到'dealloc',并且仍然在按钮的动作中创建新视图将导致泄漏。 – 2011-05-15 05:42:45
@Josh Caswell - 是的,的确如此。这是'nil'事情派上用场的地方...... if(_mainView)[_mainView release]; _mainView =/* ... * /;'但是你仍然希望在dealloc中有一个版本。 – asveikau 2011-05-15 05:45:33