38

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

4

9 に答える 9

27

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

2)プレーンself.classA = [[ClassA alloc] init];ではなく、参照する必要がありますか?self.classA.downloadUrl = @"..."classA

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

#import "ClassA.h"

于 2009-05-14T06:14:37.283 に答える
20

プロジェクト設定の他のリンカーフラグにフラグ-ObjCを設定します... (スタティックライブラリプロジェクトではなく、スタティックライブラリを使用しているプロジェクトでは...) そして、プロジェクト設定で構成がすべての構成に設定されていることを確認します

于 2010-07-23T08:45:46.547 に答える
15

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

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

于 2012-05-07T17:49:52.860 に答える
1

私のものは単純で愚かなものでした。NSManagedObject を通常の NSObject に変換した初心者の間違いです。

私が持っていた:

@dynamic order_id;

私が持っていたはずのとき:

@synthesize order_id;
于 2012-08-19T04:59:33.017 に答える
1

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

于 2012-06-19T02:02:07.563 に答える
0

非常に奇妙ですが。アプリケーション インスタンスのクラスを myApplication: NSObject ではなく myApplication: UIApplication として宣言する必要があります。UIApplicationDelegate プロトコルは +registerForSystemEvents メッセージを実装していないようです。クレイジーApple API、再び。

于 2010-12-05T22:13:53.357 に答える
0

これは必ずしも最適な設計パターンではないことに注意してください。見た目からすると、基本的に 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 デリゲート メソッドの処理と概念的に関係がない場合でも、他のすべてのアプリ グローバルをそれに混在させる必要があるというわけではありません。

于 2009-06-08T03:35:30.790 に答える