【发布时间】:2011-09-13 16:30:47
【问题描述】:
我从网上某处获得了这个示例代码。
我的 .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 似乎仍然是 1:
[username release];
[username removeFromSuperview];
[landscapeView release];
[landscapeView removeFromSuperview];
我不知道如何处理它...我没有其他地方可以使用 LandscapeView,它只在此处。
我已经尝试将 UIView 子类化以尝试找出调用保留和释放的位置,这是列表:
打开弹窗:
- 保留来自我的 PopupWindowString 初始化方法的调用
- 从 [CALayer layoutSublayers] 保留
- 从 CALayerLayoutIfNeeded 发布
关闭弹出窗口:[I hit a CCMenuItemImage]
- 从 [UIView(Hierarchy) 子视图] 中的 [__NSArrayM addObject] 保留
- 从我的代码中释放 [我之前粘贴的那个]
- 从我的代码中发布 [从子视图中删除]
如您所见,缺少一个版本。我认为,在关闭弹出窗口时,第一次保留是由我触摸视图引起的。但是它永远不会被释放。
有人知道如何解决这个问题吗?
谢谢, 克里斯蒂安
【问题讨论】:
-
retainCount方法永远不能返回 0。不要调用该方法。没用。 -
整件事都是我的错误......我试图调试为什么该死的东西不起作用,我正在使用不同的方式删除子视图 [某种数组覆盖所有子视图一一释放]。在此期间,我删除了自动释放弹出窗口的调用...然后在我进行了所有更改之后,我只是忘记将其放回...该死的 :( 抱歉浪费了时间。
标签: objective-c cocos2d-iphone dealloc retaincount