をめぐる対立を解決する'差のセレクタの送信をインスタンス'?
-
21-08-2019 - |
質問
のAppDelegateっalloc'ingインスタンスで定義されたstatic図書館があります。このインスタンスは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/";
...}
その他のクラスを、アプリを取得しますを参考に委譲呼び出クラスa.downloadUrl.
解決
1)@implementation
ブロック内のsynthesizeですか?
2)あなたの代わりに、プレーンself.classA = [[ClassA alloc] init];
のself.classA.downloadUrl = @"..."
とclassA
を参照してください?
3)あなたのmyApp.m
のファイルでは、ClassA.h
をインポートする必要がありますか? (コンパイラが見つからない場合はC変数のデフォルトでintに):
#import "ClassA.h"
他のヒント
フラグを設定する -オブジェクトC プロジェクト設定の他のリンカー フラグで...(静的ライブラリ プロジェクトではなく、静的ライブラリを使用しているプロジェクト内です...) そして、プロジェクト設定で構成が に設定されていることを確認してください。 すべての構成
多くの人がこれと似た質問のためのいくつかの非常に技術的な答えを与えているが、私はそれはそれよりも簡単だと思います。あなたが注意を払っていない場合は時々、あなたが使用しないセレクタは、インタフェースで何かに取り付けることができます。セレクタがありますが、あなたはそれのために任意のコードを書いていないため、このエラーを取得される可能性があります。
ダブルチェックするためにこのようなケースではないことを最も簡単な方法は、Controlキーを押しながらクリックしてアイテムを使用すると、それに関連付けられているセレクタのすべてを見ることができるようです。あなたがしたくないそこに何があるのなら、それを取り除きます!
...この情報がお役に立てば幸いですあなたが投稿のコードでは、あなたがsetDownloadURL:
にClassA
セッターを送っている - つまり、のクラス自体をの。あなたは、インスタンスのプロパティを設定します。
どのようにあなたのAppDelegateクラスににClassAをインポートしていますか?あなたは、メインプロジェクトで.hファイルが含まれていましたか?私はメインプロジェクトと同様に、通常の#includeにヘッダファイルをコピーしていなかったので、私はしばらくの間、この問題を持っていた「ClassA.h。」
のコピー、または.Hを作成する私のためにそれを解決します。
私にとっては、このエラーの原因は、私が誤って同じメッセージが同じクラスのメンバに2回送信されていたということでした。私は右のGUIのボタンをクリックすると、私は二回、メソッド名を見ることができる、と私はちょうど1を削除しました。しかし、確かに私の場合は初心者のミスは、考慮すべき他の初心者のためにそこにそれを取得したいです。
鉱山は愚かな/シンプルなものでした。通常のNSObjectのに自分のNSManagedObjectを変換したことのある人のための初心者のミス、ます。
私が持っていた。
@dynamic order_id;
私が持っていたはずときます:
@synthesize order_id;
いことに留意する必要がありこれは必ずしも最高のデザインパターンです。のうので、基本的にご利用のアプリの権限を委譲店にグローバル変数となります。
マット-ヴィメタルバンド対象のグローバル変数をもって彼のココアの愛の条 http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html.すべてのlikelyhood、クラスaはシングルトンではなくグローバルにAppDelegateが可能ですの趣旨クラス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として、アプリケーションインスタンスのクラスを宣言する必要があります。代わりにあるmyApplicationののUIApplication:NSObjectの。 UIApplicationDelegateプロトコルは+ registerForSystemEventsメッセージを実装していないようです。クレイジーアップルのAPIを、再びます。