Не удается выпустить UIView в cocos2d - PullRequest
0 голосов
/ 13 сентября 2011

Я получил этот пример кода, полученный где-то в Интернете.

Мой файл .h выглядит так:

@interface PopupWindowString : CCNode <UITextFieldDelegate> {
    UIView *landscapeView;
    UITextField *username;
}

, а мой файл .m в методе init содержит:

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 не вызывается.

Кажется, что retainCount на landscapeView по-прежнему равен 1 после этого кода:

[username release];

[username removeFromSuperview];

[landscapeView release];

[landscapeView removeFromSuperview];

Я понятия не имею, что с этим делать ... У меня нет других мест, где я бы использовал landscapeView, это только здесь.

Я попытался создать подкласс UIView, чтобы попытаться понятьоткуда вызываются функции сохранения и освобождения, и вот список:

Открытие всплывающего окна:

  1. Сохранение вызова из моего метода инициализации PopupWindowString
  2. Сохранение из [CALayer layoutSublayers]
  3. Выпуск из CALayerLayoutIfNeeded

Закрытие всплывающего окна: [Я ударил CCMenuItemImage]

  1. Сохранить из [__NSArrayM addObject] в [UIView (иерархия)подпредставления]
  2. освободить из моего кода [тот, который я Paранее]
  3. релиз из моего кода [удалить из подпредставления]

Как видите, один выпуск отсутствует.Я думаю, что при закрытии всплывающего окна это первое сохранение вызвано тем, что я касаюсь вида.Однако он никогда не выпускается.

Кто-нибудь знает, как исключить это?

Спасибо, Кристиан

1 Ответ

1 голос
/ 13 сентября 2011

Если вы уравновешиваете все удержания, подразумеваемые или напрямую вызываемые с выпусками, то ваша работа выполнена.

Вы уверены, что объект просочился?Как вы определили это (обратите внимание, что retainCount никогда не является правильным ответом)?

Как написано, этот код, по-видимому, не пропускает landscapeView.Обратите внимание, что если код, который его выпускает, отсутствует в вашем dealloc, вам нужно установить landscapeView на ноль, чтобы предотвратить сбой при [landscapeView release] в dealloc.

...