어떻게 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]);
}
을 REINIT 할 때 메모리 문제에게 나쁜 액세스를 가지고 내가 어떤 유지하거나 ALLOC 또는 키워드 해제가 모든 시간 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이이 경우에는 nil로 설정됩니다. –
릴리즈를'dealloc'으로 옮기고 버튼의 액션에서 새로운 뷰를 생성해도 누수가 발생합니다. –
@ Josh Caswell - 네, 맞습니다. 이것은'nil'가 유용하게 쓰이는 곳입니다 ... if (_mainView) [_mainView release]; _mainView =/* ... * /;'아직 dealloc에 릴리즈하고 싶습니다. – asveikau