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