Search code examples
linkerinterface-builderstatic-librarieslinker-flags

How “Unknown class <MyClass> in Interface Builder file” error can be fixed with a line reads "[MyClass class]"?


I read the following answer, so I know that "Unknown class in Interface Builder file" error can be solved using the -ObjC linker option. (FYI, MyClass is in static library.)

https://stackoverflow.com/a/6092090/534701

I've also found that single line of [MyClass class] code in the App Delegate can handle the same problem without using -ObjC option. My Question is how come the code can work.

According to the answer that I've attached above, the error occurs because symbols in my static libraries are not loaded. Then, it means [MyClass class] makes the Linker to load the symbol at runtime? (which doesn't make sense)


Solution

  • The linker will try to reduce the final binary size by removing unused symbols. The classes instantiated from Storyboard are created using reflection, and thus it's impossible to the linker to know if that class is being used, so it's removed from the final binary.

    By adding that line to your code you are forcing the linker to add that class at compilation time (not at runtime), making the reflection call from Storyboard to work as expected.