CGRect を NSInvocation (setArgument:atIndex:) に渡そうとします。NSValue でラップし、NSArry にプッシュしてから、NSArray から取得し、NSValue (getValue:) を使用します。(getValue:) メソッドを呼び出すと、宣言前のインデックス NSInteger i が変更されます。なぜこれが起こるのか誰にも言えますか?
NSString className = @"UIButton";
Class cls = NSClassFromString(className);
cls pushButton5 = [[cls alloc] init];
CGRect rect =CGRectMake(20,220,280,30);
NSMethodSignature *msignature1;
NSInvocation *anInvocation1;
msignature1 = [pushButton5 methodSignatureForSelector:@selector(setFrame:)];
anInvocation1 = [NSInvocation invocationWithMethodSignature:msignature1];
[anInvocation1 setTarget:pushButton5];
[anInvocation1 setSelector:@selector(setFrame:)];
NSValue* rectValue = [NSValue valueWithCGRect:rect];
NSArray *params1;
params1= [NSArray arrayWithObjects:rectValue,nil];
id currentVal = [params1 objectAtIndex:0];
NSInteger i=2;
if ([currentVal isKindOfClass:[NSValue class]]) {
void *bufferForValue;
[currentVal getValue:&bufferForValue];
[anInvocation1 setArgument:&bufferForValue atIndex:i];
}else {
[anInvocation1 setArgument:¤tVal atIndex:i];
}
[anInvocation1 invoke];
この(getValue:)
メソッドが 'i' の値を 2 から 1130102784 のような値に変更すると、(setArgument:atIndex:)
インデックス i が範囲外であるため、SIGABRT が発生します。
では、なぜ は[NSValue getValue:(*void) buffer]
他の変数を変更するのでしょうか?
(PS関数でそれを行うので、例を単純化して配列を直接初期化します。そして、直接atIndex:2を設定すると、完全に機能します。しかし、悲しいことに、少し単純化し、iをatIndexに渡す必要があります: )
Tom Dalling (特に) と sergio の問題が解決したおかげです。これを削除します:
void *bufferForValue;
[currentVal getValue:&bufferForValue];
[anInvocation1 setArgument:&bufferForValue atIndex:i];
これを貼り付けます
NSUInteger bufferSize = 0;
NSGetSizeAndAlignment([currentVal objCType], &bufferSize, NULL);
void* buffer = malloc(bufferSize);
[currentVal getValue:buffer];
[anInvocation1 setArgument:buffer atIndex:i];
ありがとうございました。Stackoverflow.com は、頭の良い人がいる本当に役立つサイトです。