Мой инстинкт дизайна подсказывает мне, что если личность счета важна в отличие от ее простой стоимости, вы должны сортировать какой-то объект оценки вместо обычных NSNumbers.
Но что в стороне: в крайнем случае вы можете использовать простой NSValue аналогично тому, как вы используете NSNumber. Это немного большая работа, чтобы получить значения, но у NSValue не существует коллаборационного поведения экземпляра NSNumber для небольших значений.
Некоторого код, который осуществляет все три модели поведения:
// NSValues are always distinct:
int foo = 5, bar = 5, outfoo, outbar;
NSValue *one = [NSValue value:&foo withObjCType:@encode(int)];
NSValue *two = [NSValue value:&bar withObjCType:@encode(int)];
[one getValue:&outfoo];
[two getValue:&outbar];
NSLog(@"one: %@ %x = %d ; two: %@ %x = %d",
[one class], one, outfoo,
[two class], two, outbar);
// by comparison with NSNumber behavior:
NSNumber *three = [NSNumber numberWithInt:6];
NSNumber *four = [NSNumber numberWithInt:6];
NSLog(@"three: %@ %x = %d ; four: %@ %x = %d",
[three class], three, [three intValue],
[four class], four, [four intValue]);
// except when the numbers are big:
NSNumber *five = [NSNumber numberWithInt:8675309];
NSNumber *six = [NSNumber numberWithInt:8675309];
NSLog(@"five: %@ %x = %d ; six: %@ %x = %d",
[five class], five, [five intValue],
[six class], six, [six intValue]);
На моем макинтоше это дает выход как:
one: NSConcreteValue 42a8d0 = 5 ; two: NSConcreteValue 42a920 = 5
three: NSCFNumber 404380 = 6 ; four: NSCFNumber 404380 = 6
five: NSCFNumber 1324d0 = 8675309 ; six: NSCFNumber 106e00 = 8675309
Почему вы заботитесь, если они тот же объект против двух различных объектов с такое же значение? – 2010-11-24 18:15:40
Потому что, хотя они имеют одинаковое значение, мне нужно, чтобы они были отдельными экземплярами для вычисления оценки. – jchatard 2010-11-24 18:33:29