Подтвердить что ты не робот

Как разрешить "непризнанный селектор, отправленный в экземпляр"?

В AppDelegate я распределяю экземпляр, определенный в статической библиотеке. Этот экземпляр имеет свойство NSString, задающее "копию". Когда я обращаюсь к строковому свойству в этом экземпляре, приложение вылетает с "непризнанным селектором, отправленным экземпляру". Xcode предоставляет подсказку кода для свойства, что означает, что он известен в вызывающем приложении. Конкретный класс компилируется в цель статической библиотеки. Что мне не хватает?

Добавление некоторого кода.

//static library 
//ClassA.h
@interface ClassA : NSObject {
...
NSString *downloadUrl;
}
@property(nonatomic, copy) NSString *downloadUrl;

//ClassA.m
@synthesize downloadUrl;

В вызывающем приложении appDelegate.

//app delegate header file
@interface myApp : NSObject <UIApplicationDelegate> {
ClassA *classA;
}
@property (nonatomic, retain) ClassA *classA;

//app delegate .m file
@synthesize classA;

- (void)applicationDidFinishLaunching:(UIApplication *)application {
classA = [[ClassA alloc] init];
//exception occurs here.  downloadUrl is of type NSCFNumber
classA.downloadUrl = @"http://www.abc.com/";
...}

Другие классы в приложении получат ссылку на делегата и вызову classA.downloadUrl.

4b9b3361

Ответ 1

1) Является ли синтез внутри блока @implementation?

2) Если вы используете self.classA = [[ClassA alloc] init]; и self.classA.downloadUrl = @"..." вместо обычного classA?

3) В вашем файле myApp.m вам нужно импортировать ClassA.h, когда он отсутствует, по умолчанию будет указано число или указатель? (в переменных C по умолчанию используется int, если не найден компилятором):

#import "ClassA.h".

Ответ 2

Установить флаг -ObjC в другом компоновщике Флаг в настройке проекта... (Не в статическом проекте библиотеки, а в проекте, использующем статическую библиотеку...) И убедитесь, что в Настройка проекта. Конфигурация настроена на Все настройки

Ответ 3

Многие люди дали некоторые очень технические ответы на этот и подобные вопросы, но я думаю, что это проще. Иногда, если вы не обращаете внимания, селектор, который вы не собираетесь использовать, может быть привязан к чему-то в интерфейсе. Вы можете получить эту ошибку, потому что селектор там, но вы не написали для него никакого кода.

Самый простой способ проверить, что это не так, - это щелкнуть элемент управления, чтобы вы могли видеть все связанные с ним селектора. Если там что-то есть, чего вы не хотите, избавитесь от него! Надеюсь, это поможет...

Ответ 4

В отправленном вами коде вы отправляете установщик setDownloadURL: в ClassA - то есть сам класс. Вы хотите установить свойство экземпляра.

Ответ 5

Как вы импортируете ClassA в свой класс AppDelegate? Вы включили файл .h в основной проект? У меня была эта проблема некоторое время, потому что я не копировал файл заголовка в основной проект, а также обычный #include "ClassA.h".

Копирование или создание .h решили это для меня.

Ответ 6

Для меня причиной этой ошибки было то, что у меня случайно было отправлено одно и то же сообщение дважды одному члену класса. Когда я щелкнул правой кнопкой мыши на кнопке в gui, я мог дважды увидеть имя метода, и я просто удалил его. Ошибка новичка в моем случае наверняка, но хотелось бы получить ее там для других новичков.

Ответ 7

Моя была чем-то простым/глупым. Ошибка новичка, для тех, кто преобразовал свой NSManagedObject в обычный NSObject.

У меня было:

@dynamic order_id;

когда я должен был:

@synthesize order_id;

Ответ 8

Следует отметить, что это не обязательно лучший шаблон дизайна. По внешнему виду вы по существу используете свой делегат приложения для хранения того, что составляет глобальную переменную.

Мэтт Галлахер хорошо освещает проблему глобалов в своей статье Cocoa с любовью в http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html. Скорее всего, ваш ClassA должен быть синглом, а не глобальным в AppDelegate, хотя его возможное намерение ClassA будет более общим, а не просто одноэлементным. В этом случае вам, вероятно, будет лучше с помощью метода класса, чтобы вернуть предварительно сконфигурированный экземпляр класса A, например:

+ (ClassA*) applicationClassA
{
    static ClassA* appClassA = nil;
    if ( !appClassA ) {
        appClassA = [[ClassA alloc] init];
        appClassA.downloadURL = @"http://www.abc.com/";
    }
    return appClassA;
}

Или в качестве альтернативы (поскольку это добавит материал, специфичный для приложения, к тому, что, возможно, относится к классу общего назначения), создайте новый класс, единственная цель которого состоит в том, чтобы содержать этот метод класса.

Дело в том, что глобальные приложения приложения не должны быть частью AppDelegate. Просто потому, что AppDelegate - это известный синглтон, не означает, что все другие глобальные приложения должны быть смешаны с ним, даже если они не имеют ничего концептуального в обработке методов делегата NSApplication.

Ответ 9

Очень странно, но. Вы должны объявить класс для своего экземпляра приложения как myApplication: UIApplication вместо myApplication: NSObject. Кажется, что протокол UIApplicationDelegate не реализует сообщение + registerForSystemEvents. Crazy Apple API, снова.