it-swarm.com.ru

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

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

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

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

//ClassA.m
@synthesize downloadUrl;

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

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

36
4thSpace

1) Синтез в блоке @implementation?

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

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

#import "ClassA.h".

26
stefanB

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

18
mihir mehta

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

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

14
Dave Kanter

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

Я имел:

@dynamic order_id;

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

@synthesize order_id;
1
Dan Power

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

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

1
Heat Miser

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

1
Rich

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

1
Chuck

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

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

0
Peter N Lewis

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

0
H2CO3