0

基本的なことをしようとしていますが、うまくいきません。

NSMutableArray似たようなオブジェクトを追跡しています。オブジェクトには「優先度」と呼ばれる NSNumber@があり、次のように初期化しています。property

[self setPriority:[[NSNumber alloc] initWithInt:2]];

ただし、ソートしようとすると:

NSSortDescriptor * frequencyDescriptor = [[NSSortDescriptor alloc] initWithKey:@"priority" ascending:YES];
NSArray * descriptors = [NSArray arrayWithObjects:frequencyDescriptor, nil];
NSArray * sortedArray = [tasks sortedArrayUsingDescriptors:descriptors]; //This line throws the exception

次のエラーが表示されます。

-[__NSCFNumber length]: unrecognized selector sent to instance 0x2c7

NSSortDescriptorこのトピックには他にも質問と回答がありますが、プロパティで並べ替えを使用しようとすると、すべての場合でまったく同じエラーがNSNumber発生し、並べ替えが行われません。

Task クラスのヘッダーは次のとおりです。

#import <Foundation/Foundation.h>

@interface Task : NSObject <NSCoding>

@property NSString *name;
@property NSNumber *priority;
@property NSString *note;
@property NSString *taskID;

@end

クラッシュ直前のタスク配列の NSNumber の内容は次のとおりです。

2013-01-03 13:55:50.056 MyApp[9682:303] <Task: 0x10192c160>, 10
2013-01-03 13:55:50.057 MyApp[9682:303] <Task: 0x10192bc60>, 2
2013-01-03 13:55:50.057 MyApp[9682:303] <Task: 0x10190fda0>, 3
2013-01-03 13:55:50.057 MyApp[9682:303] <Task: 0x10192c6f0>, 2
2013-01-03 13:55:50.058 MyApp[9682:303] <Task: 0x10192c870>, 6
2013-01-03 13:55:50.058 MyApp[9682:303] <Task: 0x10192d1d0>, 2
2013-01-03 13:55:50.058 MyApp[9682:303] <Task: 0x10192d330>, 2
2013-01-03 13:55:50.058 MyApp[9682:303] <Task: 0x10192c530>, 5

私が探しているのは、NSNumber「priority」という名前のプロパティに基づいて、オブジェクトの配列を降順で並べ替えることだけです。

このエラーが発生するのはなぜですか? おそらく非常に明白なことだとは思いますが、私はこれに 15 時間も悩まされてきました。どんな助けでも素晴らしいでしょう。

4

1 に答える 1

0

私の推測では、エントリにtasksはさまざまなタイプのオブジェクトが混在する優先度の値があり、そのうちの少なくとも 1 つは配列であり、少なくとも 1 つは NSNumber です。次に、compare は 2 つを比較しようとし、-lengthメッセージを処理できない番号にメッセージを送信します。

スタック トレースを調べると、これが正しいかどうかを確認するのに役立ち、例外がスローされている理由もわかります。

于 2013-01-03T05:49:58.857 に答える