Я создал программу, которая получает некоторые строки ввода от пользователя (она перестает печатать «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
Похоже, он не принимает значение строки из идентификатора. Зачем? Как мне изменить метод компаратора?
Нет необходимости использовать _and_ assign. Компилятор с радостью помещает 'id' в' NSString * '. Вы также можете просто отправить 'UTF8String' в' id', если компилятор не окутает глаз, но для удобства чтения я согласен, что вы должны сделать тип явным. –
Да, может быть, я не совсем понял. Я отредактировал свой ответ – Saphrosit
Правда, теперь он отлично работает, и я удалил бросок. –