1

环境:

  • 单触 (6.2.1.201)
  • Mac OSX (10.8.3)
  • iOS 模拟器 6.0

我正在尝试编写测试以确保NSNotifications我想要的NSNotificationCenter.DefaultCenter. 没问题,我想。我有我的清单,Notifications我可以问DefaultCenter它注册了什么......

哦,等等,不,你不能。:\

好的,我可以反映到我的班级并获取我创建的(私人)观察员列表并在那里签到。NSObjects除了它是一个MonoTouch.Foundation.InternalNSNotificationHandler对象列表。

好的,让我们做一些检查,InternalNSNotificationHandler它是一个内部类,它对“notificationCenter”和“notify”MonoTouch.Foundation有一个非公开的引用。NSNotificationCenterNSNotification

notify 似乎是一个不错的起点,但我在其中找不到任何对通知名称的引用。好吧,让我们检查一下通知中心。就在那里!在notificationCenter.__mt_ObserverList_var._items[i].Name. 我尝试反映到__mt_ObserverList_var(这是 a List<ObservedData>),所以我可以遍历它们并将其.Names与我的列表进行比较,并确保它们都在其中。

var ifcType = typeof(myClass);
var observerField = ifcType.GetField("_observers", BindingFlags.NonPublic | BindingFlags.Static);
var observers = observerField.GetValue(null);
var internalNSNotHandlerType = observers[0].GetType();
// so far so good
var notCenterField = internalNSNotHandlerType.GetField("notificationCenter", BindingFlags.NonPublic); // this returns null

无论我做什么,它都会返回 null。我尝试像这样从程序集中加载类型:

var assembly = Assembly.GetAssembly(typeof(NSNotificationCenter));
var internalNSNotHandlerType = assembly.GetType("MonoTouch.Foundation.InternalNSNotificationHandler");
// so far so good
var notCenterField = internalNSNotHandlerType.GetField("notificationCenter", BindingFlags.NonPublic); // this returns null

如果我达不到,我就达不到List<ObservedData>

为什么这总是返回null?是因为它没有集会的全部权利吗?在这种环境下甚至有可能获得完全权利吗?

4

0 回答 0