웹에서 어딘가에서 얻은 샘플 코드가 있습니다.cocos2d에서 UIView를 해제 할 수 없습니다.
내 .H 파일과 같이 보인다 :
@interface PopupWindowString : CCNode <UITextFieldDelegate> {
UIView *landscapeView;
UITextField *username;
}
및 init 메소드 내하는 .m 파일이 있습니다
landscapeView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
CGAffineTransform tr = landscapeView.transform;
tr = CGAffineTransformRotate(tr, (M_PI * -2.0));
landscapeView.transform = tr;
landscapeView.center = [[CCDirector sharedDirector] openGLView].center;
username = [[UITextField alloc] initWithFrame:CGRectMake(160, 100, 160, 90)];
[username setTextAlignment:UITextAlignmentCenter];
[username setDelegate:self];
[username setPlaceholder:@"New name"];
[username setTextColor:[UIColor colorWithRed:255 green:255 blue:255 alpha:1.0]];
[landscapeView addSubview:username];
[[[CCDirector sharedDirector] openGLView] addSubview:landscapeView];
모든 것이 멋지다 내가 닫을 때를 제외한 모든 팝업의 dealloc이 호출되지 않습니다 .
이 landscapeView에 retainCount이 코드 후에도 한 것 같다 :
[username release];
[username removeFromSuperview];
[landscapeView release];
[landscapeView removeFromSuperview];
나는 그것으로 수행 할 작업에 대한 단서가 없다 ... 나는 landscapeView을 사용하는 것이 다른 곳이없는 , 여기에있어.
나는 시도하고 유지하고 해제에서 호출되는 곳을 파악하는 UIView의 하위 클래스를 시도하고 여기에 목록의 한 :
팝업 열기 :
- 내 PopupWindowString의 init 메소드에서 호출을 유지를
- [layoutSublayers의 CALayer]에서
는 :
- 가 [__NSArrayM addObject] 내 코드 [I 이전에 붙여 넣은 일]
- 릴리스 [UIView의 (계층 구조) 파단]
- 릴리스에서 유지 [나는 CCMenuItemImage 충돌] 내 코드에서 [서브 뷰에서 제거]
하나의 릴리스가 누락 된 것을 볼 수 있습니다. 제 생각에 팝업을 닫을 때,이 첫 번째 유지는 제가보기에 닿아서 발생합니다. 그러나 결코 방출되지 않는다.
누구나이 하나의 방법을 아십니까?
감사합니다, 당신은 명시 적이든 묵시적이든 직접 자료를 호출 한 다음 작업이 완료 유지함의 모든 균형을하는 경우 크리스티안
'retainCount' 메서드는 0을 반환 할 수 없습니다. 해당 메서드를 호출하지 마십시오. 그것은 쓸모가 없다. – bbum
모든 것이 제 실수였습니다 ... 왜 저런 것이 작동하지 않는지 디버그하려고했는데 다른 방법을 사용하여 서브 뷰를 제거했습니다. 서브 뷰를 모두 하나씩 풀어주는 모든 서브 뷰에 대해 배열을 제거했습니다.이 동안 나는 autorelease 내 Popup에 대한 호출을 제거했다 ... 내가 만든 모든 변경 후에 나는 그걸 다시 넣는 것을 잊어 버렸다. ... 빌어 먹을 :(낭비한 시간에 죄송합니다.) – Krystian