2011-12-30 13 views
2

にNSObjectのにvoid *型のポインタポイントかどうかをテストするにはどうすれば...魔女がvoidポインタが実際に客観Cオブジェクトポインタ(NSObjectの*)であるかどうかをテストすることがベストプラクティスです知っていただきたいと思いますのObjective C

- (id)initWithExecPath:(NSString*)executePath withArgs:(NSArray*)args identifier:(NSString*)identifierString contextInfo:(void*)contextInfo { 

// I would like to check here if contextInfo is an NSObject 

} 

おかげで...

答えて

2

CocoaWithLoveサイトからこの記事をチェックアウト:任意 ポインタが有効へのポインタである場合は、この記事で

は、私はテストのためのアプローチを見てObjective- C ob ject。 からの結果は正確ではなく、ポインターが有効なメモリ位置でない場合はデバッグするgdb の妨げになる可能性があります。 しばしばやりたいことがあります(もちろん生産中ではありません。 コード) 。しかし、割り当てられていないメモリを盲目的に見つめているときに便利なデバッグツールになる可能性があります。

+0

はhttp://cocoawithlove.com/2010/10/testing-if-arbitrary-pointer-is-valid.htmlである必要があります – nielsbot

+1

あなたの記事をありがとう、すでにこれをチェックして、より簡単なアプローチがあるかどうか疑問に思っています。 – Vassilis

0

答えは、 "Objective-Cオブジェクトですか?"という一般的なテストを行うことはできません。このようなテストは、オブジェクトの内部構造を調べなければならないため、定義上脆弱です。 Objective-Cオブジェクトのように見えるが、そうではないメモリのランダムな部分が渡される可能性もあります。例えば最近割り当てが解除されたオブジェクトです。

0

これを確認する信頼できる方法はありません。また、コンテキストポインタを取るAPIは、それが何であるか、それが何を指しているかを気にするべきではありません。コンテキストとして呼び出し側に戻す以外に何もしてはいけません。

おそらくあなたは間違った質問をしています。それがNSObjectであることを知ったら、正確に何をしたいですか?

+0

xmm、私は同意しますが...このメソッドはNSThreadを初期化しています。 contextInfoポインタを渡すと、NSThreadの実行が終了したときにオブジェクトがポイントしていることを確認する方法(まだ割り当て解除されていない)が残っていますか? (NSThreadはデリゲートメソッドを呼び出してデリゲートにcontextInfoを渡し終わったことを通知します)。だからNSObjectならそれを保持するつもりだと思う - それはちょうど* intまたは* charであることに注意してください。もちろん、このメソッドでは2つのパラメータ(idと* void)を使用できます。代わりに、などを探して:)ありがとう! – Vassilis