0

我有这个从网络上某个地方得到的示例代码。

我的 .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 进行子类化以尝试找出调用保留和释放的位置,这是列表:

打开弹窗:

  1. 保留来自我的 PopupWindowString 初始化方法的调用
  2. 从 [CALayer layoutSublayers] 保留
  3. 从 CALayerLayoutIfNeeded 释放

关闭弹出窗口:[我打了一个 CCMenuItemImage]

  1. 从 [UIView(Hierarchy) 子视图] 中的 [__NSArrayM addObject] 保留
  2. 从我的代码中释放[我之前粘贴的那个]
  3. 从我的代码中释放 [从子视图中删除]

如您所见,缺少一个版本。我认为,在关闭弹出窗口时,第一次保留是由我触摸视图引起的。然而,它永远不会被释放。

有谁知道如何解决这个问题?

谢谢,克里斯蒂安

4

1 回答 1

1

如果您正在平衡所有隐含或直接调用的保留与发布,那么您的工作就完成了。

您确定该对象正在泄漏吗?你是如何确定的(注意这retainCount永远不是正确的答案)?

如所写,该代码似乎没有泄漏landscapeView. 请注意,如果发布它的代码不在dealloclandscapeView[landscapeView release].dealloc

于 2011-09-13T18:15:53.593 回答