0

次のように NSInvocation を使用しています。

私のinitでは、これをviewDidLoadに書いています:

SEL mySelector;
mySelector = @selector(initParsersetId:type:);

NSMethodSignature * sig = nil;
sig = [[self class] instanceMethodSignatureForSelector:mySelector];

myInvocation = nil;
myInvocation = [NSInvocation invocationWithMethodSignature:sig];
[myInvocation setTarget:self];
[myInvocation setSelector:mySelector];

そして、私はそれを次のように呼んでいます:

Idea *tempIdea = [[Idea alloc]init];
tempIdea = [genericArray objectAtIndex:indexPath.row];
idea.ideaId = tempIdea.ideaId;
[tempIdea release];

NSNumber *_id_ = [NSNumber numberWithInt:idea.ideaId];
[myInvocation setArgument:_id_ atIndex:2];  //CRASHING AT THIS LINE

指定された行でアプリケーションがクラッシュしています。誰でも私を助けてもらえますか?

4

3 に答える 3

0

I've found the answer but I'm not convinced how. Actually, initially I was writing all the initialisation code in viewDidLoad and simply reusing the NSInvocation object by passing it the different argument since NSInvocation is a mutable object. It didn't work. Then I wrote a method with all the initialisation code inside it and called that method every time I used the NSInvocation object and it worked...

于 2010-06-14T13:49:20.080 に答える
0

コードからはあまり明確ではありません。しかし、私は何か疑わしいものを見ています。うまくいけば、それはあなたの役に立つヒントを提供するかもしれません.

まず、インスタンスを保持していないことがわかります ([NSInvocation... から自動解放されます)。[NSInvocation...] からのインスタンスは自動解放されるため、クラス レベル変数 myInvocation は viewDidLoad イベントの後にインスタンスを保持しません。

コードの 2 番目のことは、セレクターが init で始まる一種のカスタマイズされたコンストラクターであることです。同じインスタンス内でイベントを呼び出すことができるかどうかはわかりません。もう1つのポイントは、呼び出されるinit ...メソッドがselfを返す場合ですか?そのはず。

NSLog 関数を使用して、セレクタ イベントにいくつかのメッセージを出力できます。NSLog によるすべてのメッセージは、XCode の出力コンソールに表示されます。

于 2010-06-14T16:25:17.913 に答える
0

setArgument: には、引数自体ではなく、渡す引数のアドレスを指定する必要があります。

[myInvocation setArgument:&_id_ atIndex:2];

いいえ

[myInvocation setArgument:_id_ atIndex:2];

また、関数が最初の引数として NSNumber を取ることは確かですか?

于 2011-08-01T01:49:05.447 に答える