2016-09-30 72 views
1

我發現iOS 10上的問題,其中未加載帶有字符串生成的classname的viewcontroller。這個問題發生在iPad Air 2上,當用戶第二次啓動應用程序時(在關閉它之後)。使用NSBundle通過字符串檢索類-classnamed:iOS10中失敗

在帶有Xcode 8的模擬器中,錯誤是可重現的。似乎viewcontroller無法實例化,並且此代碼不再工作。這是正確的嗎?

Class controllerClass = [[NSBundle mainBundle] classNamed:className]; 

回答

0

解決方案是使用簡單的開關盒結構來創建控制器。它需要更多的代碼,但它是更安全的代碼。

1

我發現了一種解決方法,它使用底層Objective-C函數objc_getClass()並忽略了NSBundle的現在(自iOS10?以來)錯誤的方法。由於該函數與[MyClass類]相同,因此它不應該失敗。

使用此代碼的我的應用程序的舊版本(iOS8及更早版本)似乎也在新硬件上失敗。看起來設備越快,該方法就越有可能失敗。對我來說,iOS模擬器的失敗率約爲50%。

id objc_getClass(const char *name); // define the function signature without importing it 
    Class cls = objc_getClass([s cStringUsingEncoding:NSASCIIStringEncoding]); 
    NSAssert(cls != nil, @"classNamed: %@ returned nil!", s); 

參考