OC静的ライブラリNSClassFromStringはnilの解決を得る
1332 ワード
静的ライブラリにクラス名からクラスに反射するコードがある場合は、次のようにします.
64ビットシステムからのバグ:
私の実測ではまず、静的ライブラリのプロジェクトではなく、メインプロジェクト(target)でbuild settingを変更する必要があります.次に、
NSString *myClassStr = @"myClass";
Class myClazz = NSClassFromString(myClassStr);
if (myClazz) {
id myClassInit = [[myClazz alloc] init];
}
(よく)Classがnilになった場合、ネット検索では、一般的にはこう言います.The class object named by aClassName, or nil if no class by that name is currently loaded. If aClassName is nil, returns nil.
64ビットシステムからのバグ:
IMPORTANT: For 64-bit and iPhone OS applications, there is a linker bug that prevents -ObjC from loading objects files from static libraries that contain only categories and no classes. The workaround is to use the -all_load or -force_load flags. -all_load forces the linker to load all object files from every archive it sees, even those without Objective-C code. -force_load is available in Xcode 3.2 and later. It allows finer grain control of archive loading. Each -force_load option must be followed by a path to an archive, and every object file in that archive will be loaded.
私の実測ではまず、静的ライブラリのプロジェクトではなく、メインプロジェクト(target)でbuild settingを変更する必要があります.次に、
-all_load
が有効で、-force_load
はコンパイルすらできません.上に、メインプロジェクト(静的ライブラリを参照するプロジェクト)のbuild settingでother linker flags
を検索し、-all_load
を追加すればいいのです.