我正在尝试从单独的NOB文件中加载包含地图视图和2个按钮的视图。
编辑:我应该提到我不能将UIViewController子类化,因为我不希望视图以标准方式呈现(例如作为模态)。我希望它只使用屏幕的四分之一,是透明的,并且像弹出视图一样呈现。因此,UIVIewController不建议用于不占用整个屏幕的视图,或者至少不会作为标准模态视图控制器或UINavigationController层次结构的控制器呈现。不想使用UIViewController子类(Apple说不这样做),我决定构建一个容器对象,它是NSObject的后代,它将处理连接和解除分配。
在容器对象内部,我只有1个IBOutlet :(视图)。我在init函数中以这种方式加载nib:
- (id)init {
self = [super init];
if (self) {
[[NSBundle mainBundle] loadNibNamed:"myNib" owner:self options:nil];
}
return self;
}
在NIB内部有一个视图,里面有一个MapView,还有两个按钮。作为文件的所有者,我已经设置了Container对象的类,并且我已将“view”插座连接到文件所有者的插座。 nib加载正常,我可以加载它并将其视图添加到我的子视图中。
self.currentLocationMapView = [[[CurrentLocationViewContainer alloc] init] autorelease];
self.currentLocationMapView.delegate = self;
[self.view addSubview:self.currentLocationMapView.view];
问题在于解除分配,因为在成功释放容器对象时,视图不会在其中释放:
[self.currentLocationMapView.view removeFromSuperview];
self.currentLocationMapView = nil;
永远不会调用我的自定义视图的dealloc消息,它位于容器对象中。我必须显式调用[self.currentLocationMapView.view release],以便在我想要它时将其释放。
请注意,“self.currentLocationMapView.view”是我的视图控制器中的容器对象。容器对象包含自定义视图,而自定义视图又包含地图视图和2个按钮。
答案 0 :(得分:1)
由于没有人回答这个问题,我也可以自己回答,因为我在搜索时找到了解决方案和其他一些有用的信息。
我的问题的解决方案在我的应用程序中发现了一个非常难以找到的错误。错误是什么并不重要,它是非常特定于应用程序的,并且不同于任何其他应用程序。
就UIViewControllers而言,您不应该使用UIViewControllers或子类来使用Apple的Standard方法以外的方法显示Views。永远。如果要向用户提供不属于视图层次结构的用户视图(如UITabBarController或UINavigationController或类似内容),则必须以编程方式执行此操作,而不必将View Controller用作此类的管理器对象。您应该使用NSObject作为视图的管理器。
这是因为UIViewController的内部保持对视图和其中的其他对象的引用,这些对象在调用UIViewController的某些方法时释放。如果不是Apple视图层次结构的一部分,则永远不会调用这些方法,从而造成内存泄漏。