Несмотря на ошибку « Неизвестный класс MyClass в файле Interface Builder. », напечатанную во время выполнения, эта проблема не имеет ничего общего с Interface Builder, а скорее с компоновщиком, который не связывает класс, потому что нет Код использует его напрямую.
Когда данные .nib (скомпилированные из .xib) загружаются во время выполнения, на ссылку MyClass
ссылается строка, но компоновщик не анализирует функциональность кода, а только существование кода, поэтому он не знает, что , Поскольку другие исходные файлы не ссылаются на этот класс, компоновщик оптимизирует его при создании исполняемого файла. Поэтому, когда код Apple пытается загрузить такой класс, он не может найти связанный с ним код и выводит предупреждение.
По умолчанию для целей Objective-C будут установлены -all_load -ObjC
флажки по умолчанию, в которых будут храниться все символы. Но я начал с цели C ++ и не имел этого. Тем не менее, я нашел способ обойти это, что делает линкер агрессивным.
Хак, который я изначально использовал, заключался в добавлении пустой статической подпрограммы, например:
+(void)_keepAtLinkTime;
, который ничего не делает, но я бы назвал один раз, например:
int main( int argc, char** argv )
{
[MyClass _keepAtLinkTime];
// Your code.
}
Это заставит компоновщик сохранить весь класс, и ошибка исчезнет.
Как указал jlstrecker в комментариях, нам не нужно добавлять метод _keepAtLinkTime
. Просто позвоните существующему, например:
[MyClass class];
делает трюк (если вы производите от NSObject
).
Конечно, вы можете позвонить в любое место вашего кода. Я думаю, это может быть даже в недоступном коде. Идея состоит в том, чтобы обмануть компоновщика, заставляя его думать, что MyClass
используется где-то, чтобы он не был настолько агрессивным в его оптимизации.
Xcode 6.3.2 и Swift 1.2
Быстрое определение зрения. Обязательно переопределите init(coder aDecoder: NSCoder)
. Objective-C определение представления контроллера. И перо в грушевом дереве.
Добавьте имя модуля в инспектор деталей Nib, где вы выбираете свой класс.