2011-09-13 3 views
0

웹에서 어딘가에서 얻은 샘플 코드가 있습니다.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의 하위 클래스를 시도하고 여기에 목록의 한 :

팝업 열기 :

  1. 내 PopupWindowString의 init 메소드에서 호출을 유지를
  2. [layoutSublayers의 CALayer]에서
,691,363 CALayerLayoutIfNeeded에서
  • 릴리스 보유 팝업 닫기210

    는 :

    1. 가 [__NSArrayM addObject] 내 코드 [I 이전에 붙여 넣은 일]
    2. 릴리스 [UIView의 (계층 구조) 파단]
    3. 릴리스에서 유지 [나는 CCMenuItemImage 충돌] 내 코드에서 [서브 뷰에서 제거]

    하나의 릴리스가 누락 된 것을 볼 수 있습니다. 제 생각에 팝업을 닫을 때,이 첫 번째 유지는 제가보기에 닿아서 발생합니다. 그러나 결코 방출되지 않는다.

    누구나이 하나의 방법을 아십니까?

    감사합니다, 당신은 명시 적이든 묵시적이든 직접 자료를 호출 한 다음 작업이 완료 유지함의 모든 균형을하는 경우 크리스티안

  • +0

    'retainCount' 메서드는 0을 반환 할 수 없습니다. 해당 메서드를 호출하지 마십시오. 그것은 쓸모가 없다. – bbum

    +0

    모든 것이 제 실수였습니다 ... 왜 저런 것이 작동하지 않는지 디버그하려고했는데 다른 방법을 사용하여 서브 뷰를 제거했습니다. 서브 뷰를 모두 하나씩 풀어주는 모든 서브 뷰에 대해 배열을 제거했습니다.이 동안 나는 autorelease 내 Popup에 대한 호출을 제거했다 ... 내가 만든 모든 변경 후에 나는 그걸 다시 넣는 것을 잊어 버렸다. ... 빌어 먹을 :(낭비한 시간에 죄송합니다.) – Krystian

    답변

    1

    .

    개체가 유출되지 않았습니까? 어떻게 결정 했습니까 (retainCount는 정답이 아닙니다).

    작성된대로 해당 코드는 landscapeView을 유출하지 않습니다. 코드를 해제하는 코드가 dealloc에없는 경우 [landscapeView release]dealloc 일 때 충돌을 방지하려면 landscapeView을 nil로 설정해야합니다.

    +0

    감사합니다. – Krystian

    관련 문제