在MonoTouch中检查iOS类(而不是方法)的可用性

时间:2013-01-31 02:18:35

标签: ios xamarin.ios weak-linking

MonoTouch公开了RespondsToSelector方法,用于检查iOS版本中方法的可用性。

但是我似乎无法找到如何对班级可用性进行类似的检查 Apple documents it here在iOS 4.2+中,您应该尝试访问所需类的静态class选择器。 e.g:

if ([EKReminder class]) 
{
    ....
}

然而,这似乎并没有暴露出来。我认为它类似于my previous question here,因为要在MT中实现它,需要在每个MT类型上显式映射Class静态属性。

所以我想我的问题是,我应该使用旧的iOS 4.2前技术吗?即:

Class cls = NSClassFromString (@"EKReminder");
if (cls) 
{
    ...
}

我认为映射到:

var iosClass = Class.GetHandle("EKReminder");
if ( iosClass != null )
    ...

或者使用Messaging中提供的互操作方法手动调用选择器?

还是我找不到的其他方法?

2 个答案:

答案 0 :(得分:5)

安全检查正在使用:

if (Class.GetHandle (typeof (EKReminder)) != IntPtr.Zero) {
    // we know we can use EKReminder
}

然而,它有点昂贵,因为它涉及反射。 Objective-C名称可能与.NET名称不同(例如NSURLNSUrl,只能通过反映Register属性来找到。

如果你知道Objective-C名称,那么你可以使用非类型安全的重载来跳过反射。 E.g。

// checking for NSUrl would not work
if (Class.GetHandle ("NSURL") != IntPtr.Zero) {
    // we know we can use NSUrl
}

再次(并且为每个人概括我的答案)使用iOS版本对非硬件功能进行运行时检查通常是最好/更容易/更快。

if (UIDevice.CurrentDevice.CheckSystemVersion (5,0)) {
    // we know feature X was added in 5.0
}

答案 1 :(得分:3)

只需使用iOS 4.2之前的技术:

var iosClass = Class.GetHandle ("EKReminder");
if (iOSClass != null)
    ...

Apple推荐的方法似乎是由gcc / clang特殊设置的,在MonoTouch中不起作用。