Для дальнейшего ответа на ваш вопрос.Если вы посмотрите в документации для isEqualToNumber: NSNumber , вы заметите следующую строку:
Два объекта NSNumber считаются равными, если они имеют одинаковый идентификатор значений или, если они имеют эквивалентные значения
, важно, чтобы вы это поняли.В вашем коде, который вы спрашиваете, мой объект NSNumber "число" равно "значению", вы не спрашиваете, равно ли числовое значение, сохраненное в моем объекте "NSNumber" число ", числовому значению, хранящемуся в моем объекте" NSNumber "значение".
Последняя строка кода, которую вы написали, показывает, что на самом деле числовые значения вашего NSNumber фактически равны.
NSLog(@"%d", [number unsignedLongLongValue] == value); //1
Таким образом, вы правильно сохраняете и извлекаете значения, вы должны использовать == метод сравнения с объектами NSNumber хранит числовые значения (т.е. intValue == intValue, unsignedLongLongValue == unsignedLongLongValue) и не сравнивает их идентификаторы объектов вместе.
Что касается этой строки кода
NSLog(@"Current Number:%@", number); // -2538698204676668398, weird
Это не странно, это совершенно нормально, так как вы сказали NSLog распечатать представление NSObject 'number'.Я не уверен на 100%, но я считаю, что функция NSNumber - ( NSString * ) description
по умолчанию возвращает целое число без знака для числового значения, которое оно содержит.Вот почему вы получаете большое отрицательное число.Возможно, вы захотите взглянуть на функцию - (NSString *)descriptionWithLocale:(id)aLocale
NSNumber, чтобы распечатать данные более логично для вас, или вы можете использовать
NSLog(@"Current Number:%llu", [number unsignedLongLongValue]);
, который даст вам правильный ответ.
РЕДАКТИРОВАТЬ:
В дополнение к этому, после изучения вопроса, происходит то, что при воспоминании вашего объекта NSNumber из UserDefaults его первоначальный тип номера не сохраняется (эта информация выделенав документации для NSNumber в разделе обзора)
(Обратите внимание, что числовые объекты не обязательно сохраняют тип, с которым они созданы.)
Вы можете увидеть это самиесли вы запишете следующее после получения «числа» из значений по умолчанию пользователя (добавьте это в конец кода, который у вас есть в вашем вопросе) и посмотрите значения кодировки, показанные здесь
NSLog(@"%s", [number objCType]); //This will log out q
NSLog(@"%s", [[NSNumber numberWithUnsignedLongLong:value] objCType]); //this will log out Q
Разница между Q и q в том, что Q - это беззнаковое значение ... следовательно, поэтому у вас возникают проблемы с функцией isEqualToNumber: в качестве числатипы разные.Если вы настолько устали от использования функции iSEqualToNumber: для сравнения значений, вы можете реализовать это для извлечения вашего значения из NSUserDefaults.
NSNumber *number = [NSNumber numberWithUnsignedLongLong:[[NSUserDefaults standardUserDefaults] objectForKey:NumberKey] unsignedLongLongValue]];
Вы можете посмотреть на использование функции NSNumber compare:возвращаемое значение - NSOrderedSame, однако это не сработает для сравнения беззнаковых и подписанных значений одного и того же типа, поэтому в вашей ситуации я бы использовал вышеприведенное, поскольку получение данных из NSUserDefaults лишает «подписанность» вашего числа.