1

Objective-C でセレクターを使用する方法を学習する演習を行っています。
このコードでは、2 つの文字列を比較しようとしています。

int main (int argc, const char * argv[])
{
    @autoreleasepool
    {
        SEL selector= @selector(caseInsensitiveCompare:);
        NSString* str1=@"hello";
        NSString* str2=@"hello";
        id result=[str1 performSelector: selector withObject: str2];
        NSLog(@"%d",[result boolValue]);
    }
    return 0;
}

しかし、それはゼロを出力します.なぜですか?

編集:
str2 を @"hell" に変更すると、EXC_BAD_ACCESS が発生します。

4

2 に答える 2

6

ドキュメントにperformSelector:、「オブジェクト以外のものを返すメソッドについては、NSInvocation を使用してください」と記載されています。caseInsensitiveCompare:はオブジェクトの代わりに を返すため、より複雑NSIntegerな を作成する必要があります。NSInvocation

NSInteger returnVal;
SEL selector= @selector(caseInsensitiveCompare:);
NSString* str1=@"hello";
NSString* str2=@"hello";

NSMethodSignature *sig = [NSString instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
[invocation setTarget:str1];
[invocation setSelector:selector];
[invocation setArgument:&str2 atIndex:2]; //Index 0 and 1 are for self and _cmd
[invocation invoke];//Call the selector
[invocation getReturnValue:&returnVal];

NSLog(@"%ld", returnVal);
于 2012-07-13T21:04:36.910 に答える
1

試す

NSString* str1=@"hello";
NSString* str2=@"hello";

if ([str1 caseInsensitiveCompare:str2] == NSOrderedSame)
            NSLog(@"%@==%@",str1,str2);
else
            NSLog(@"%@!=%@",str1,str2);
于 2012-07-13T21:02:07.063 に答える