RemoveFromSuperview():iOS SDK5中的不同行为?

时间:2011-11-21 16:18:51

标签: c# objective-c cocoa-touch events xamarin.ios

我在iOS5上运行我的应用时遇到了崩溃问题。 我有的代码星座:

  • UIViewController A 有一个事件“InputEnded”。
  • UIViewController B A 的视图添加为子视图并附加到InputEnded
  • InputEnded中, B 从超级视图中删除 A 的视图,删除事件处理程序,处理 A 并设置它为NULL。

在iOS 4.3中,这可以正常工作,但A ViewDidDisappear()永远不会被调用,但没关系。

然而,在iOS 5中,A的ViewDidDisappear() DOES 会触发。它会在稍后的时间点被解雇。但问题是:即使A已经被处理也会发出(Handle == 0),因此它会崩溃!

我同时,A和BI覆盖bool AutomaticallyForwardAppearanceAndRotationMethodsToChildViewControllers并返回FALSE以保持与我在iOS 4.3中看到的相同的行为,但显然它总是会调用自己的ViewDidDisappear(),无论你返回什么。

有人可以解释这里发生了什么,以及如何克服它?

1 个答案:

答案 0 :(得分:0)

发生崩溃的原因是 A 不应该手动处理,只能归零。

处置 A 会破坏控制器的本机表示形式,对于iOS5 SDK,在稍后调用ViewDidDisappear时仍需要它。 iOS4.3 SDK没有发生崩溃,因为它没有调用ViewDidDisappear

所以简单地忽略 A 意味着用户代码不再引用(托管)实例,并让GC稍后收集它(一旦没有别的引用它)。这适用于两个SDK版本,并且在两种情况下都回收内存(通过向 A 添加终结器以在执行后将字符串输出到MonoDevelop的应用程序输出来确认)。

完整的测试用例和说明可在bugzilla上找到。