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

<p>в appdelegate я выделяю экземпляр, определенный в статической библиотеке. этот экземпляр имеет свойство nsstring, устанавливающее «копию». когда я получаю доступ к строковому свойству в этом экземпляре, приложение вылетает с «нераспознанным селектором, отправленным экземпляру». xcode предоставляет подсказку кода для свойства, что означает, что оно известно в вызывающем приложении. определенный класс компилируется в статическую библиотечную цель. что мне не хватает?</p><p>добавление некоторого кода.</p><pre><code>//static library //classa.h @interface classa : nsobject { ... nsstring *downloadurl; } @property(nonatomic, copy) nsstring *downloadurl; //classa.m @synthesize downloadurl; </code></pre><p>в приложении вызова вызывающего приложения.</p><pre><code>//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/"; ...} </code></pre><p>другие классы в приложении получат ссылку на делегат и вызовут classa.downloadurl.</p>

<p>1) синтез в блоке <code>@implementation</code>?</p><p>2) стоит ли ссылаться на <code>self.classa = [[classa alloc] init];</code> и <code>self.classa.downloadurl = @"..."</code> вместо простого <code>classa</code>?</p><p>3) в ваш файл <code>myapp.m</code> вам нужно импортировать <code>classa.h</code>, если он отсутствует, по умолчанию будет номер или указатель? (в переменных c по умолчанию используется значение int, если оно не найдено компилятором):</p><p><code>#import "classa.h"</code>.</p>

<p>установите флаг<strong> -objc </strong>в другом флаге компоновщика в настройках своего проекта ... (не в проекте статической библиотеки, а в проекте, который использует статическую библиотеку ...) и убедитесь, что в настройках проекта для параметра конфигурация установлено значение<strong> вся конфигурация </strong> </p>

<p>многие люди дали очень технические ответы на этот и подобные вопросы, но я думаю, что это проще, чем это. иногда, если вы не обращаете внимания, к интерфейсу может быть прикреплен селектор, который вы не собираетесь использовать. возможно, вы получаете эту ошибку, потому что селектор есть, но вы еще не написали код для него. </p><p>самый простой способ проверить, что это не так, - это щелкнуть по элементу, удерживая клавишу control, чтобы увидеть все селекторы, связанные с ним. если там есть что-то, чем ты не хочешь быть, избавься от этого! надеюсь это поможет...</p>

<p>у меня было что-то простое/глупое. ошибка новичка для любого, кто преобразовал свой nsmanagedobject в обычный nsobject.</p><p>я имел:</p><pre><code>@dynamic order\_id; </code></pre><p>когда я должен был:</p><pre><code>@synthesize order\_id; </code></pre>

<p>как вы импортируете classa в свой класс appdelegate? вы включили .h файл в основной проект? у меня была эта проблема некоторое время, потому что я не копировал заголовочный файл в основной проект, а также обычный #include "classa.h". </p><p>копирование или создание .h решило это для меня.</p>

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

<p>в опубликованном вами коде вы отправляете установщик <code>setdownloadurl:</code> в <code>classa</code>, то есть сам <em>class</em>. вы хотите установить свойство экземпляра.</p>

<p>вы должны отметить, что это не обязательно лучший шаблон дизайна. судя по всему, вы, по сути, используете свой делегат приложения для хранения того, что составляет глобальную переменную.</p><p>мэтт галлахер подробно рассмотрел вопрос о глобалах в своей статье «какао с любовью» по адресу <a href="http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html">http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html</a> . по всей вероятности, ваш classa должен быть единичным, а не глобальным в appdelegate, хотя вполне возможно, что вы намерены использовать classa более общего назначения, а не просто одиночную. в этом случае вам, вероятно, будет лучше использовать метод класса для возврата предварительно сконфигурированного экземпляра класса a, что-то вроде:</p><pre><code>+ (classa*) applicationclassa { static classa* appclassa = nil; if ( !appclassa ) { appclassa = [[classa alloc] init]; appclassa.downloadurl = @"http://www.abc.com/"; } return appclassa; } </code></pre><p>или, в качестве альтернативы (поскольку это добавит специфичные для приложения вещи к тому, что, возможно, является классом общего назначения), создайте новый класс, единственная цель которого состоит в том, чтобы содержать этот метод класса.</p><p>дело в том, что глобалы приложений не обязательно должны быть частью appdelegate. тот факт, что appdelegate является известным одноэлементным, не означает, что любое другое глобальное приложение должно быть смешано с ним, даже если они не имеют никакого концептуального отношения к обработке методов делегата nsapplication.</p>

<p>очень странно, но. вы должны объявить класс для своего экземпляра приложения как myapplication: uiapplication вместо myapplication: nsobject. кажется, что протокол uiapplicationdelegate не реализует сообщение + registerforsystemevents. сумасшедшие apple api, опять же.</p>