2009-04-02 3 views
0

Я ссылаюсь на статическую библиотеку другого проекта. Я успешно выполнил instructions from this site. Ниже представлен проект с использованием класса с именем FileIO из библиотеки.Как ссылаться на свойство статической библиотеки

Я создаю объект FileIO и присваиваю его свойству имя. Затем я получаю __TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__ о присвоении имени.

В applicationDidFinishLaunching я это делаю:

fileObj = [[FileIO alloc] init]; 
fileObj.name = @"test"; 

и это в файле .h:

@class FileIO; 

@interface Nav1AppDelegate : NSObject <UIApplicationDelegate> { 

    UIWindow *window; 
    UINavigationController *navigationController; 
    FileIO *fileObj; 
} 

В библиотеке FileIO простой класс с именем в нем. Я также пробовал [fileObj setName:@"test"], но получаю те же результаты. Вот трассировка стека:

2009-04-01 20:37:17.721 NavNew[81425:20b] *** -[FileIO setName:]: unrecognized selector sent to instance 0x5219b0 

2009-04-01 20:37:17.723 NavNew[81425:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[FileIO setName:]: unrecognized selector sent to instance 0x5219b0' 

2009-04-01 20:37:17.724 NavNew[81425:20b] Stack: (

    2454561035, 
    2461146683, 
    2454590218, 
    2454583564, 
    2454583762, 
    11275, 
    816111650, 
    816149355, 
    2455110190, 
    2454063909, 
    2454064344, 
    827745792, 
    827745989, 
    816114848, 
    816160924, 
    11128, 
    10982 
) 
(gdb) 

Я обнаружил, что это проблема только с членами экземпляра (свойство или метод). Статические методы работают нормально. Я также открыл файл библиотеки .a в проекте хостинга. Я не вижу свойство экземпляра где-нибудь в нем.

Любые предложения о том, что я делаю неправильно?

+0

Какое исключение вы получаете? В какой строке кода это относится? –

+0

Просто обновлен, чтобы отразить эти ответы. Благодарю. – 4thSpace

+0

Пожалуйста, отправьте исключение _entire_. Предоставленная вами информация не поможет. Скопируйте + вставьте всю трассировку стека. Если у вас есть какие-либо сомнения относительно того, следует ли вам что-то публиковать, опубликуйте его. –

ответ

0

По какой-то причине объект FileIO, который у вас есть, не отвечает на сообщение setName:, поэтому при попытке отправить это сообщение он бросает NSInvalidArgumentException. Мое лучшее предположение заключается в том, что по какой-то причине общая библиотека не загружается должным образом, поэтому реализация setName: не загружается, поэтому среда выполнения запуталась и думает, что setName: не реализован.

Я не уверен, как это исправить, но похоже, что [[FileIO alloc] init] преуспевает (или, по крайней мере, до момента исключения исключения), поэтому что-то работает как минимум. Для того, чтобы получить список сообщений, которые разрешены, вы можете попробовать следующее:

unsigned int methodCount; 
Method *methods = class_copyMethodList(object_getClass(fileObj), &methodCount); 
for(unsigned int i = 0; i < methodCount; i++) 
    NSLog(@"Method %u: %s", i, sel_getName(method_getName(methods[i]))); 
free(methods); 

Для получения информации о различных методах во время выполнения Objective-C, см Objective-C 2.0 Runtime Reference.

+0

Спасибо, но не могу даже приблизиться к запуску этого кода. Метод находится во время выполнения.h, но где runtime.h? – 4thSpace

+0

Другое редактирование. Это происходит только с членами экземпляра. Подождите ... разве это не «статическая» библиотека? – 4thSpace

1

В «instructions», который использовался для «импорта» статической библиотеки, автор описывает несколько случаев странных ошибок, которые происходят несколько случайным образом, поэтому я бы предложил другой подход: используя ссылку на кросс-проект Xcode и общую сборку выходной каталог. Вот ссылка на учебник со скриншотами: http://www.clintharris.net/2009/iphone-app-shared-libraries/

Я использую эту стратегию в течение нескольких месяцев с несколькими проектами и статическими библиотеками - это было здорово, и у меня не было никаких проблем. Другим действительно приятным преимуществом является то, что вы используете переменную среды Xcode для ссылки на проект со статической библиотекой (включая файлы заголовков); это делает решение действительно гибким, если у вас есть несколько разработчиков, работающих над одним и тем же проектом, нужно перемещать каталоги и т. д.

Смежные вопросы