2012-05-08 4 views
0

Я создал программу, которая получает некоторые строки ввода от пользователя (она перестает печатать «exit»), помещает их в NSMutableArray и сортирует их:Сортировка 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* [email protected]""; 
    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 

Похоже, он не принимает значение строки из идентификатора. Зачем? Как мне изменить метод компаратора?

ответ

4

id1 и id2 фактически NSString s, даже если они отлиты в id и переданы вашей функции (этот подход является полезным, поскольку вы можете определить compare функцию для того, чтобы отсортировать пользовательские объекты).

Не имеет смысла называть stringValue на строке (и, фактически, NSString не имеет функции-члена с именем stringValue).

Для работы со строками просто вернитесь к NSString s.

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

Это не строго необходимо (вы даже можете работать непосредственно с id1 и id2), но отливка позволит избежать вам получить предупреждения компилятора (также это понятнее код).

+0

Нет необходимости использовать _and_ assign. Компилятор с радостью помещает 'id' в' NSString * '. Вы также можете просто отправить 'UTF8String' в' id', если компилятор не окутает глаз, но для удобства чтения я согласен, что вы должны сделать тип явным. –

+0

Да, может быть, я не совсем понял. Я отредактировал свой ответ – Saphrosit

+0

Правда, теперь он отлично работает, и я удалил бросок. –

Смежные вопросы