Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS从nib加载视图会导致内存泄漏吗?_Ios_Loading_Bundle_Nib - Fatal编程技术网

iOS从nib加载视图会导致内存泄漏吗?

iOS从nib加载视图会导致内存泄漏吗?,ios,loading,bundle,nib,Ios,Loading,Bundle,Nib,我试图从一个单独的NOB文件中加载包含一个地图视图和两个按钮的视图 编辑:我应该提到,我不能将UIViewController子类化,因为我不希望视图以标准方式显示(例如作为模式)。我希望它只使用屏幕的四分之一,是透明的,并且像弹出式视图一样显示。因此,对于不会占据整个屏幕或至少不会显示为标准模式视图控制器或UINavigationController层次结构的控制器的视图,不建议使用UIVIewController 由于不想使用UIViewController子类(苹果说不要这样做),我决定构

我试图从一个单独的NOB文件中加载包含一个地图视图和两个按钮的视图

编辑:我应该提到,我不能将UIViewController子类化,因为我不希望视图以标准方式显示(例如作为模式)。我希望它只使用屏幕的四分之一,是透明的,并且像弹出式视图一样显示。因此,对于不会占据整个屏幕或至少不会显示为标准模式视图控制器或UINavigationController层次结构的控制器的视图,不建议使用UIVIewController

由于不想使用UIViewController子类(苹果说不要这样做),我决定构建一个ContainerObject,NSObject的后代,它将处理连接和释放

在容器对象内部,我只有1个IBOutlet:(视图)。我在init函数中以这种方式加载nib:

- (id)init {
self = [super init];
if (self) {
    [[NSBundle mainBundle] loadNibNamed:"myNib" owner:self options:nil];
}
return self;
}

在NIB内部有一个视图,其中有一个MapView和两个按钮。作为文件的所有者,我设置了容器对象的类,并将“视图”出口连接到文件所有者中的出口。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个按钮。

既然没有人回答这个问题,我不妨自己回答,因为我在搜索时找到了解决方案和一些其他有用的信息

我的问题的解决方案在于我的应用程序中存在一个很难发现的bug。错误是什么并不重要,它是非常特定于应用程序的,不同于任何其他应用程序

就UIViewControllers而言,您不应该使用UIViewControllers或子类来使用Apple标准方法以外的方法显示视图。曾经如果要向用户呈现不属于视图层次结构的视图,如UIDABBARCONTROLLER、UINavigationController或诸如此类的对象,则必须以编程方式执行此操作,而无需将视图控制器用作此类的管理器对象。您应该使用NSObject作为视图的管理器


这是因为UIViewController的内部保留了对视图和其中其他对象的引用,这些对象在调用UIViewController的某些方法时会被释放。如果这些方法不属于Apple视图层次结构的一部分,则永远不会被调用,从而造成内存泄漏。

Apple确实对UIViewController子类进行了说明。事实上,如果你创建一个新的iphone应用程序。UIViewController至少有一个子类。你的ContainerObject完成了定制UIViewController的设计任务。你能给我们指一下苹果的文档吗?上面说不要将UIViewController子类化?@JeanLuc:我知道。然而,我应该说我不想以标准的方式表达我的观点。我想把它显示为一个弹出窗口。你可以在这里看到这个家伙的答案:我没有时间在论坛上搜索它。然而,他是对的。如果您创建了自定义视图控制器,但没有按预期的方式使用它,它将不会接收必须接收的视图控制器消息,并且会泄漏内存,因为它将被释放,但不会释放其视图。因为我找到了答案,我把它和更多的信息一起贴在下面,这些信息会把事情弄清楚的。。我还从视图控制器调用了在XIB文件中定义的警报视图,这导致了泄漏…我唯一没有得到的是,正如您所说的“您应该使用NSObject作为视图的管理器。”您能提供一些代码示例吗?