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実際にはsです(カスタムオブジェクトを並べ替えるために関数を定義できるため、このアプローチは便利です)。NSStringidcompare

文字列を呼び出すことは意味がありませんstringValue(実際、NSStringという名前のメンバー関数はありませんstringValue)。

文字列を操作するには、sにキャストバックするだけNSStringです。

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

これは厳密には必要ではありませんが(とを直接操作することもできます)、キャストするid1id2コンパイラの警告が表示されなくなります(コードがより明確になります)。

于 2012-05-08T22:16:15.003 に答える