Класс Foo реализован в MyApp и MyAppTestCase.Один из двух будет использован.Какой из них не определен.
Интересно, почему это так?
, потому что оба изображения (приложение и пакет модульного теста) определяют реализацию класса.класс динамически загружается в среду выполнения objc.среда выполнения objc использует плоское пространство имен.как это работает:
- двоичный файл загружается, начиная с его зависимостей
- при загрузке каждого двоичного файла, классы objc регистрируются во время выполнения objc
- , есликласс с определенным именем загружается дважды, поведение не определено.одна реализация класса (с одинаковыми именами) может быть загружена в среду выполнения objc.
типичная проблема в том, что вам будет возвращена одна реализация - ваше приложение скорее всегосбой при конфликте типов (когда класс не происходит из одного и того же исходного файла).
Обычно этого можно избежать, переименовав класс или экспортировав класс в одном изображении.переименование класса, очевидно, не относится к вашему делу.у вас есть один файл Foo.m
, который компилируется, экспортируется и загружается двумя изображениями, когда он должен быть в одном.
это должно быть интерпретировано вами как ошибка компоновщика дубликатов символов.несмотря на то, что реализация - это тот же исходный файл (и реализация та же) - эту проблему вы должны решить.
Как я могу решить эту проблему?
если Foo.m
является классом приложения, вы должны удалить (не компилировать и не ссылаться) Foo.m
из модульного теста.если это часть модульного теста, не компилируйте и не связывайте его с целью модульного теста.
затем следуйте инструкциям в посте для привязки / загрузки вашего модульного теста в приложение.это в этой общей области поста: где «WhereIsMyMac» - это имя приложения, которое вы тестируете модулем.Это позволит тестировать целевую ссылку на приложение (поэтому вы не получите ошибок компоновщика при компиляции). важная часть состоит в том, что ваши тестовые файлы скомпилированы в цели модульного теста (только), а классы вашего приложенияскомпилирован и связан с приложением.Вы не можете просто добавить их - они связываются и загружаются динамически.
Может быть, я что-то упустил при установке цели модульного теста?
Из статьи, на которую вы ссылались:
Примечание. Цель тестирования - это отдельная цель.Это означает, что вы должны быть осторожны с целевым членством.Все исходные файлы приложения должны быть добавлены только к цели приложения.Файлы тестовых кодов должны быть добавлены только к цели тестирования.
Часть, которую вы ошиблись, - это, вероятно, фазы соединения и загрузки пакета модульного тестирования.