web-dev-qa-db-ja.com

「インスタンスに送信された認識されないセレクター」を解決する方法は?

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を呼び出します。

36
4thSpace

1)合成は@implementationブロック内にありますか?

2)単純なclassAの代わりにself.classA = [[ClassA alloc] init];self.classA.downloadUrl = @"..."を参照する必要がありますか?

3)myApp.mファイルでClassA.hをインポートする必要がありますが、見つからない場合はデフォルトで数値またはポインターになりますか? (コンパイラで見つからない場合、C変数のデフォルトはint):

#import "ClassA.h"

26
stefanB

フラグを設定します-ObjCプロジェクト設定のその他のリンカーフラグ...(静的ライブラリプロジェクトではなく、静的ライブラリを使用しているプロジェクト...)そして、プロジェクト設定でAll Configurationに設定されます

19
Mihir Mehta

多くの人がこの質問や同様の質問に対して非常に技術的な答えを出しましたが、それはそれよりも簡単だと思います。注意を払っていない場合は、使用するつもりのないセレクタをインターフェイスの何かにアタッチすることができます。セレクターが存在するため、このエラーが発生している可能性がありますが、コードをまだ作成していません。

これが当てはまらないことを再確認する最も簡単な方法は、アイテムをコントロールクリックして、それに関連付けられているすべてのセレクターを表示できるようにすることです。そこになりたくないものがあれば、それを取り除きましょう!お役に立てれば...

15
Dave Kanter

私のものはシンプルで愚かなものでした。 NSManagedObjectを通常のNSObjectに変換した人にとっての初心者の間違い。

私が持っていた:

@dynamic order_id;

私が持っているべきだったとき:

@synthesize order_id;
1
Dan Power

ClassAをAppDelegateクラスにどのようにインポートしますか?メインプロジェクトに.hファイルを含めましたか?ヘッダーファイルをメインプロジェクトと通常の#include "ClassA.h"にコピーしなかったため、しばらくこの問題が発生しました。

.hをコピーまたは作成することで解決しました。

1
Heat Miser

私にとってこのエラーの原因は、同じクラスメンバーに誤って同じメッセージを2回送信してしまったことです。 GUIのボタンを右クリックすると、メソッド名が2回表示され、1つだけ削除しました。私の場合は間違いなく初心者の間違いですが、他の初心者が検討できるようにそれを公開したかったのです。

1
Rich

投稿したコードでは、setDownloadURL: setter to ClassA —つまり、クラス自体。インスタンスのプロパティを設定します。

1
Chuck

これは必ずしも最適なデザインパターンではないことに注意してください。見た目からは、本質的にApp Delegateを使用して、グローバル変数の量を保存しています。

Matt Gallagherは、 http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html の彼のCocoa with Love記事で、グローバルの問題をよく取り上げています。すべての可能性において、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:NSObjectではなくmyApplication:UIApplicationとして宣言する必要があります。 UIApplicationDelegateプロトコルは+ registerForSystemEventsメッセージを実装していないようです。 Crazy Apple API、もう一度。

0
H2CO3