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

StackOverflow https://stackoverflow.com/questions/861626

Вопрос

В 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.

Это было полезно?

Решение

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

2) Стоит ли обращаться к self.classA = [[ClassA alloc] init]; и self.classA.downloadUrl = @"..." вместо простого classA?

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

#import "ClassA.h".

Другие советы

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

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

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

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

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

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

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

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

Я имел:

@dynamic order_id;

когда мне следовало бы:

@synthesize order_id;

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

Мэтт Галлахер хорошо осветил проблему глобальных переменных в своей статье «Какао с любовью» на сайте 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top