1

私は次の問題を抱えていて、それを解決できませんでした、おそらく誰かがトリックを知っています:)

メインオブジェクトは異なる可能性があるため、動的である必要があります...

呼び出す必要のある関数:

+ (NSArray *)parseJSONString:(NSString *)theJSONString error:(NSError **)errorPointer

コードがすでに宣言しているので、JSONを解析したいと思います。この関数を実装しているオブジェクトがいくつかあるので、performSelectorメソッドを使用します。

if ([[self.theObject class] respondsToSelector:@selector(parseJSONString:error:)]) {
     NSError *parsingError = nil;
     self.myObjectsCollection = [[self.theObject class] performSelector:@selector(parseJSONString:)
                                                             withObject:utf8ResponseString
                                                             withObject:parsingError];        
}

utf8ResponseStringにはJSONが含まれています...

私はすでに次のことを試しました:

... withObject:&parsingError -> compile error
... withObject:[NSValue valueWithPointer:&parsingError] -> works until the value will be redirect to the parsingError -> Bad Exec

私は1日を検索しましたが、これを解決する方法については何もわかりません-助けてください...

おかげで、挨拶、マシュー

4

3 に答える 3

4

完全を期すために他の回答に追加するために、実行時にのみ名前がわかっているメソッドを動的に呼び出す必要がある場合(この場合は必要なかったことがわかりますが、必要だった場合)、オブジェクト以外の引数を使用して、その場合、適切な解決策は次のようになります。

  • NSInvocationを使用する、または
  • objc_msgSend...ランタイム関数の1つを直接呼び出す
于 2012-10-10T00:37:13.647 に答える
2

メソッドのperformSelector:...ファミリーは、オブジェクト引数のみを取ります。オブジェクトと同じものではないポインタにポインタを渡したいので、型システムはそれを許可しません。performSelector:幸いなことに、ここではまったく必要ありません。あなたはただすることができます[[self.theObject class] parseJSONString:utf8ResponseString error:&parsingError]

performSelector:送信したいメッセージが実行時までわからない場合にのみ使用する必要があります。最初の引数として変数を渡さない場合は、おそらくそれは必要ありません。

ただし、これを行う必要がある場合は、オブジェクト(たとえば、NSValue)を受け取り、非オブジェクト型で実際のメソッドを呼び出す「ラッパー」メソッドを作成する必要があります。で実際のメソッドの代わりにラッパーを呼び出しますperformSelector:withObject:

于 2012-10-09T16:39:53.940 に答える
1

代わりに、クラスのメソッドを直接呼び出さないのはなぜですか?メソッドに応答できることをすでに確認しました。したがって、メソッドを直接呼び出します。

[[self.theObject class] parseJSONString: nil error: &error].

ちなみに、単純なステートジーパターンスワップを行うことができます。オブジェクトレスポンダーが実行時に定義されている場合でも、メッセージ呼び出しは定義されていません。コンパイラが警告した場合は、idにトランスタイプします。クラスメソッドにプロトコルを割り当てることができるかどうかわからないためです。(しかし多分あなたはそうすることができます)。

すべてのオブジェクトパーサーをプロキシパーサークラスに埋め込んで、コンパイル時に定義することもできます。

確かなことは、ポインターオブジェクト(** erorr)へのポインターをperformSelector ::に渡すことができるということです(ランタイムは占い師ではないため)。本当に必要な場合は、単純なc関数callBackを実行しますか?

于 2012-10-09T16:40:51.463 に答える