Ios 未调用UIViewController析构函数

Ios 未调用UIViewController析构函数,ios,objective-c,uiviewcontroller,Ios,Objective C,Uiviewcontroller,目前我有两个名为FormA和FormB的uiviewcontroller 现在FormA称FormB,因为FormA中的FormB属性是非原子的且强的 self.formB = [[ MediaPlayer alloc] initWithNibName:@"MediaPlayer" bundle:nil ]; //Pass some values to FormB (all of these fields are strong) ((formB*)self.formB).SongInProgre

目前我有两个名为FormA和FormB的uiviewcontroller

现在FormA称FormB,因为FormA中的FormB属性是非原子的且强的

self.formB = [[ MediaPlayer alloc] initWithNibName:@"MediaPlayer" bundle:nil ];
//Pass some values to FormB (all of these fields are strong)
((formB*)self.formB).SongInProgress_Name= songName;
((formB*)self.formB).SongInProgress_Path= song_path;
((formB*)self.formB).MusicCollectionPath= self.ArraySongNamePath;
[self presentViewController:self.formB animated:TRUE completion:nil];
当FormB试图关闭时,它会返回FormA

[ ((FormA*)self.presentingViewController) BackHere];
现在回到形式上。FormA试图以这种方式关闭FormB

[self.presentedViewController dismissViewControllerAnimated:TRUE completion:nil];

self.formB = nil;
执行上述操作不会调用FormB中的析构函数

-(void)dealloc {

    /* Desructor*/
}

为什么不调用析构函数

这可能不是问题的根源,但您永远不应该这样做:

保留对要显示的视图控制器的强引用不是您的职责。视图层次将保留它。你不是主人;视图层次结构为。所以你不能拥有所有权。在创建和显示视图控制器时,将其设置为局部变量:

MediaPlayer* mp = [[ MediaPlayer alloc] initWithNibName:@"MediaPlayer" bundle:nil ];
mp.SongInProgress_Name = songName; // etc.
[self presentViewController:mp animated:TRUE completion:nil];

正如我一开始所说,这很重要,但可能不是问题的根源。在MediaPlayer的实现中可能有一个保留周期。但是你没有显示任何代码,所以我无法知道。为什么不使用仪器和泄漏模板找出保留周期在哪里?

补充Matt的答案,很可能是由于保留周期,您的视图控制器没有解除分配。它们是由相互保持强引用的对象生成的,这在未正确解耦视图控制器时很常见,例如:


您可以通过更改行[FormA*self.presentingViewController BackHere]来优化代码;至[self.presentingViewController dismissViewControllerAnimated:YES完成:nil]。这使FormB成为一个更抽象的视图控制器,将来可以从其他非FormA的视图控制器中显示,并且不再需要将FormB存储为FormA中的变量,增加两个类的解耦并减少无意中创建保留周期的可能性。

FormB是否强烈引用FormA,更重要的是,是否还有其他内容强烈引用FormB?我不知道代码中有任何其他部分强烈引用这一点。我正在阅读关于评测的文章,希望能有所帮助。我真的不知道为什么DownVoteTank会更新我的代码。我也更新了我的帖子。我正在从FormA传递一些对FormB的强引用。你认为这可能是FormB没有销毁的原因吗?至少在你展示了附加代码的情况下,没有。但是我不知道你还在做什么。我重复一遍——你不必感到惊讶,你不必问。仪器会告诉你问题出在哪里。关于我应该在仪器上看什么的任何建议。特别是哪个部分?我想我会发布一个更新。问题是另一个类具有强委托类型。强委托类型使类保持活动状态。我知道它在其他地方!:如果你能解决这个问题,我很高兴,但我不相信从[FormA*self.presentingViewController]改变过来;至[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];它本身会对你的记忆管理产生一点点影响。很明显,它起了一点作用,我就是这么想的。我仍然不知道为什么。我目前正在查找有关评测的资源,如果我找到了,我会发回。我还使用一些已关闭的外部库,因此我不确定可能会发生什么。再一次,我将不好地描述并报告问题可能是什么。再次感谢您的帮助Matt,您是对的,这样做本身不会影响内存管理,我的建议只是建议使用良好的代码实践,通过消除在父对象中引用子对象的需要来减少无意中创建保留周期的机会,这似乎就是MistyD所经历的。干杯
MediaPlayer* mp = [[ MediaPlayer alloc] initWithNibName:@"MediaPlayer" bundle:nil ];
mp.SongInProgress_Name = songName; // etc.
[self presentViewController:mp animated:TRUE completion:nil];