1

我正在做一个练习来学习如何在 Objective-C 中使用选择器。
在这段代码中,我试图比较两个字符串:

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 回答