Преобразует ли Nssortdescriptor содержимое массива в целое после сортировки? - PullRequest
0 голосов
/ 07 ноября 2019

Учитывая приведенный ниже код, на первой итерации логи отображаются нормально. Для второй итерации приложение вылетает со следующим сообщением об ошибке:

019-11-07 09:54:08.156277+0100 xxxion[520:202084] iconNumberString : 1026
2019-11-07 09:54:12.160849+0100 xxxtion[520:202084] [self.iconNumbers lastObject]) : 1026
2019-11-07 09:54:24.598805+0100 xxxion[520:202084] -[__NSSingleObjectArrayI addObject:]: unrecognized selector sent to instance 0x2824a3fd0
(lldb) 

Используемый nssortdescriptor:

        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"intValue" ascending:YES];

Для решения этой проблемы: 1 - поскольку я думал, что nssordescriptor преобразуетсодержимое массива в целое число, так как указанный ключ указывает в nssortdescriptor, добавлен следующий журнал: NSLog (@ "[self.iconNumbers lastObject]):% i", [self.iconNumbers lastObject]);чтобы проверить, были ли значения преобразованы в целое число или нет

вопрос заключается в следующем: 1-делает ли nssortdescriptopn содержимое NSArray в целое число, так как nssordescriptor указывает -initWithKey: @ "intValue" -?

2-для этой строки_

 self.iconNumbers = (NSMutableArray *)[self.iconNumbers    
 sortedArrayUsingDescriptors:@[sortDescriptor]];

почему изменения не должны были применяться непосредственно к -self.iconnumbers- ?? почему я должен присвоить результаты RightHandSide одному и тому же -self.iconnumber- снова ??

код :

For loop 
 [self.iconNumbers addObject:iconNumberString];
         self.iconNumbers = (NSMutableArray *)[self.iconNumbers sortedArrayUsingDescriptors:@[sortDescriptor]];
        NSLog(@"iconNumberString : %@", iconNumberString);
        NSLog(@"[self.iconNumbers lastObject]) : %@", [self.iconNumbers lastObject]);

        NSLog(@"[self.iconNumbers lastObject]) : %i", [self.iconNumbers lastObject]);//added for testing after received the crash
End of loop

1 Ответ

1 голос
/ 07 ноября 2019

sortedArrayUsingDescriptors: возвращает NSArray. Он не применяется сам по себе, он применяет «копию» и возвращает отсортированную копию.

Кастинг, то есть выполнение (NSMutableArray *)something не волшебство. Это не превратит NSArray в NSMutableArray. Это просто говорит компилятору, не бойтесь, я говорю вам, что это NSMutableArray, относитесь к нему как таковому в следующий раз, поверьте мне (и вы ошибаетесь).

Либо используйте sortUsingDescriptors: напрямую, либо замените (NSMutableArray *) на [[NSMutableArray alloc] initWithArray:

For loop 
    [self.iconNumbers addObject:iconNumberString];
    self.iconNumbers = [[NSMutableArray alloc] initWithArray:[self.iconNumbers sortedArrayUsingDescriptors:@[sortDescriptor]]];
End of loop

или

For loop 
    [self.iconNumbers addObject:iconNumberString];
    [self.iconNumbers sortUsingDescriptors:@[sortDescriptor]];
End of loop

Для остальных:

Он будет использовать sortDescriptor в качестве «преобразования» для сортировки, но не будет заменять значение преобразованием. Представьте себе, у вас есть массив NSDictionary, выглядящий так: @{@"key1": @"Hello", @"key2": @"Hi"}, установка дескриптора не будет заменять каждый словарь значением key1 (Hello).

Наконец, вы можете иметь только NSObjectв NS(Mutable)Array нет примитива. Тогда, на максимуме, NSNumber инкапсулирует Int.

...