Сбой "Symbol not found" при тестировании кода Mac OS X 10.7 для 10.6
У меня есть приложение, которое использует несколько классов, найденных только в 10.7 Lion. (Например, NSFileCoordinator.)
Когда мое приложение запускается, оно может использовать NSFileCoordinator для координации доступа для чтения к хранилищу данных. (Я сохраняю в XML.)
Приложение запускается нормально под 10.7 Lion, но при запуске под 10.6 Snow Leopard приложение вылетает с ошибкой, показанной ниже.
Мой базовый SDK установлен на 10,7, а цель развертывания - 10,6. Насколько я могу судить, весь мой код правильно упакован, например:
if (NSClassFromString(@"NSFileCoordinator") != nil) {
// Do something the 10.7 way
} else {
// Do something the 10.6 way
}
Но по какой-то причине я все еще вижу крушение. Поскольку Base SDK 10.7, я не могу запустить приложение под Xcode в 10.6, что затрудняет отладку. Дополнительные сообщения регистрируются в консоли:
9/1/11 9:48:03 AM [0x0-0x18018].com.me.myapp[173] dyld: Symbol not found: _OBJC_CLASS_$_NSFileCoordinator
9/1/11 9:48:03 AM [0x0-0x18018].com.me.myapp[173] Referenced from: /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
9/1/11 9:48:03 AM [0x0-0x18018].com.me.myapp[173] Expected in: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
9/1/11 9:48:03 AM [0x0-0x18018].com.me.myapp[173] in /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
И отчет о сбое:
Process: myapp [137]
Path: /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
Identifier: com.me.myapp
Version: 1.5.0 (150)
Code Type: X86-64 (Native)
Parent Process: launchd [92]
Date/Time: 2011-09-01 09:40:32.591 -0400
OS Version: Mac OS X 10.6.8 (10K549)
Report Version: 6
Interval Since Last Report: 2009 sec
Crashes Since Last Report: 5
Per-App Crashes Since Last Report: 5
Anonymous UUID: 32784C79-0821-471E-BCBF-BE5874774075
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread: 0
Dyld Error Message:
Symbol not found: _OBJC_CLASS_$_NSFileCoordinator
Referenced from: /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
Expected in: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
in /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
2 ответа
У @Anomie правильный ответ, но позвольте мне подробнее остановиться на нем. Вот код инструмента командной строки, который похож на то, что вы делаете:
int main (int argc, const char * argv[])
{
@autoreleasepool {
if (NSClassFromString(@"NSFileCoordinator")) {
NSLog(@"Version >= 10.7");
} else {
NSLog(@"Version < 10.7");
}
}
return 0;
}
Единственный фреймворк, на который эта программа ссылается - это Foundation. Но для слабой связи с этим фреймворком вы должны сделать следующее:
- Нажмите на проект в браузере проекта
- Перейти к "Фазы сборки"
- Перейдите к "Связать двоичные файлы с библиотеками" и удалите "Foundation.framework"
Перейдите в "Настройки сборки" и добавьте следующие "Другие флаги компоновщика":
-слабая основа
Перестрой свой проект. Я тестировал на OS X 10.6 и 10.7, и ни один не рухнул, и оба дали ожидаемый результат. Надеюсь это поможет.
Вам необходимо слабо связать структуру, чтобы эти неразрешенные символы не были ошибкой во время загрузки.