0

我制作了一个程序,它从用户那里获取一些输入字符串(它停止输入“exit”),将它们放入 NSMutableArray 并对其进行排序:

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>

NSInteger compare( id id1, id id2, void* context)
{
    NSString* str1=[id1 stringValue], *str2=[id2 stringValue]; /* ****** exception here */
    const char* buf1, *buf2;
    buf1=[str1 UTF8String];
    buf2=[str2 UTF8String];
    if(strcmp(buf1,buf2)<0)
        return NSOrderedAscending;
    else
        return NSOrderedDescending;
}


int main (int argc, const char * argv[])
{
    NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
    NSMutableArray* array=[[NSMutableArray alloc]init];
    NSString* str=@"";
    char buffer[100];
    NSLog(@"Type a sequence of strings, ending with 'exit', the strings will be sorted in alphabethical order");
    while(! [str isEqualToString:@"exit\n"])
    {
        fgets(buffer,100,stdin);
        str=[NSString stringWithUTF8String: buffer];
        [array addObject: str];

    }
    [array sortUsingFunction: compare context: NULL];
    [array release];
    [pool drain];
    return 0;
}

但是我在用“ ** ”标记的行中遇到了一个异常,它说:

2012-05-09 00:10:14.502 CLITest[1029:903] -[NSCFString stringValue]: unrecognized selector sent to instance 0x10010cbf0

似乎它没有从 id 中获取字符串值。为什么?我应该如何更改比较器方法?

4

1 回答 1

4

id1并且id2实际上是NSStrings,即使它们被强制转换id并传递给您的函数(这种方法很有用,因为您可以定义compare函数以便对自定义对象进行排序)。

调用字符串是没有意义stringValue的(事实上,NSString没有名为 的成员函数stringValue)。

要使用字符串,只需转换回NSStrings。

NSString *s1 = (NSString*) id1;
NSString *s2 = (NSString*) id2;

这不是绝对必要的(您甚至可以直接使用id1and id2),但是强制转换会避免您收到编译器警告(这也是一个更清晰的代码)。

于 2012-05-08T22:16:15.003 回答