Вот цитата из другого сообщения:
Я работаю в проекте iOS, который включает статическую библиотеку, созданную другой компанией. В библиотеку включена старая версия AFNeworking, и у меня нет исходных файлов.
Теперь мне нужно использовать более новую (и менее подверженную ошибкам) версию afneworking, но я не могу включить тот же класс дважды в проект (конечно), потому что все "дублированные символы"
Моя проблема в том, что я готовлю рамки iOS и хочу избежать этой ситуации в будущем. Я не говорю об AFNetworking, но о других довольно популярных iOS-системах. Кроме того, я применил некоторые пользовательские изменения в исходном коде фрейма.
Единственный способ избежать "дублирования символов" и "класса X" реализован как в Y, так и в Z. Один из двух будет использоваться ", который приходит мне на ум, это добавить некоторый префикс к исходным классам инфраструктуры, но это правильное решение?
ОБНОВЛЕНИЕ 1:
Я попытался применить решение Джона, но без радости. Я создал упрощенный проект (вот ссылка на репо) с двумя классами FrameworkClass, которые присутствуют только в рамках целевой среды, и SharedClass, которые присутствует как в инфраструктуре, так и в приложениях, поэтому, возможно, вы увидите, что я делаю что-то неправильно. После запуска приложения я все еще получаю:
objc[96426]: Class SharedClass is implemented in both .../TestFramework.framework/TestFramework and .../SymbolsVisibilityTest.app/SymbolsVisibilityTest. One of the two will be used. Which one is undefined
ОБНОВЛЕНИЕ 2:
Вот мой вывод из nm
на основе предоставленного образца проекта-вывода:
0000000000007e14 t -[FrameworkClass doFramework]
0000000000007e68 t -[SharedClass doShared]
U _NSLog
U _NSStringFromSelector
00000000000081f0 s _OBJC_CLASS_$_FrameworkClass
U _OBJC_CLASS_$_NSObject
0000000000008240 s _OBJC_CLASS_$_SharedClass
00000000000081c8 s _OBJC_METACLASS_$_FrameworkClass
U _OBJC_METACLASS_$_NSObject
0000000000008218 s _OBJC_METACLASS_$_SharedClass
0000000000007fb0 s _TestFrameworkVersionNumber
0000000000007f70 s _TestFrameworkVersionString
U ___CFConstantStringClassReference
U __objc_empty_cache
U _objc_release
U _objc_retainAutoreleasedReturnValue
U dyld_stub_binder`
ОБНОВЛЕНИЕ 3:
Мне удалось "скрыть" символы SharedClass, применив решение от @bleater, а мой вывод из nm
теперь:
U _NSLog
U _NSStringFromSelector
00001114 S _OBJC_CLASS_$_FrameworkClass
U _OBJC_CLASS_$_NSObject
00001100 S _OBJC_METACLASS_$_FrameworkClass
U _OBJC_METACLASS_$_NSObject
U ___CFConstantStringClassReference
U __objc_empty_cache
U _objc_release
U _objc_retainAutoreleasedReturnValue
U dyld_stub_binder`
Но я все еще получаю предупреждение о двойной реализации в Xcode.