刚刚发生了一些奇怪的事情。
我在 NSUserDefaults 中存储了一个带有 unsigned long long 值的 NSNumber。当我检索它时,值刚刚改变。看起来系统认为这个数字是 long long 而不是 unsigned long long。
更糟糕的是,当我将从 UserDefaults 中检索到的数字与原始数字进行比较时,结果是 NotEqual!
代码有什么问题?谢谢!
static NSString * const NumberKey = @"MyNumber";
unsigned long long value = 15908045869032883218ULL;
if ([[NSUserDefaults standardUserDefaults] objectForKey:NumberKey] == nil) {
NSNumber *number = [NSNumber numberWithUnsignedLongLong:value];
[[NSUserDefaults standardUserDefaults] setObject:number forKey:NumberKey];
NSLog(@"Original Number:%@", number); // 15908045869032883218, right
}
NSNumber *number = [[NSUserDefaults standardUserDefaults] objectForKey:NumberKey];
NSLog(@"Current Number:%@", number); // -2538698204676668398, weird
NSLog(@"Current Value:%llu", [number unsignedLongLongValue]); // 15908045869032883218, right
NSLog(@"%d", [number isEqualToNumber:[NSNumber numberWithUnsignedLongLong:value]]); // 0
NSLog(@"%d", [number unsignedLongLongValue] == value); // 1
最佳答案
进一步回答你的问题。如果您查看 documentation for NSNumber的 isEqualToNumber: 函数您会注意到以下行,
Two NSNumber objects are considered equal if they have the same id values or if they have equivalent values
了解这一点很重要。在你的代码中,你问的是我的 NSNumber 对象“数字”是否等于“值”,你不是在问我的 NSNumber 对象“数字”中存储的数值是否等于我的 NSNumber 对象“值”中存储的数值。
您编写的最后一行代码表明实际上您的 NSNumber 的数值实际上是相等的。
NSLog(@"%d", [number unsignedLongLongValue] == value); //1
因此您正确地存储和检索了值,您应该使用 == 比较方法与存储数值的 NSNumber 对象(即 intValue == intValue、unsignedLongLongValue == unsignedLongLongValue),而不是将它们的对象 ID 一起比较。
至于这行代码
NSLog(@"Current Number:%@", number); // -2538698204676668398, weird
这并不奇怪,这是完全正常的,因为您已经告诉 NSLog 打印出“数字”的 NSObject 表示。我不是 100% 确定,但我相信 NSNumber 的 - ( NSString * ) description 函数默认为它包含的数值返回一个 unsigned int 值。这就是您返回大量负数的原因。你可能想看看 NSNumber 的 - (NSString *)descriptionWithLocale:(id)aLocale 函数来为你打印出更符合逻辑的数据,或者你可以使用
NSLog(@"Current Number:%llu", [number unsignedLongLongValue]);
哪个会给你正确的答案。
编辑:
此外,在调查问题后发生的事情是,在从 UserDefaults 中重新收集 NSNumber 对象时,它的原始数字类型没有被保留(此信息在概述部分的 NSNumber 文档中突出显示)
(Note that number objects do not necessarily preserve the type they are created with.)
如果您在从用户默认设置中检索“数字”后记录以下内容(将其添加到您问题中的代码末尾)并查看显示的编码值 here,您可以自己看到这一点
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 正在剥离您号码的“签名”。
关于iphone - NSNumber 存储在 NSUserDefaults 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7670596/
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于
我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不
我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject
我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf
对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化
有没有办法将RubyVM::InstructionSequence存储到文件中并稍后读取?我尝试了Marshal.dump但没有成功。我收到以下错误:`dump':no_dump_dataisdefinedforclassRubyVM::InstructionSequence(TypeError) 最佳答案 是的,有办法。首先,您需要使InstructionSequence的load方法可访问,默认情况下该方法是禁用的:require'fiddle'classRubyVM::InstructionSequence#RetrieveR
下面是我用来从应用程序中解析CSV的代码,但我想解析位于AmazonS3存储桶中的文件。当推送到Heroku时它也需要工作。namespace:csvimportdodesc"ImportCSVDatatoInventory."task:wiwt=>:environmentdorequire'csv'csv_file_path=Rails.root.join('public','wiwt.csv.txt')CSV.foreach(csv_file_path)do|row|p=Wiwt.create!({:user_id=>row[0],:date_worn=>row[1],:inven
如果我构建了一个应用程序来访问来自Gmail、Twitter和Facebook的一些数据,并且我希望用户只需输入一次他们的身份验证信息,并且在几天或几周后重置,那会怎样是在Ruby中动态执行此操作的最佳方法吗?我看到很多人只是拥有他们客户/用户凭证的配置文件,如下所示:gmail_account:username:myClientpassword:myClientsPassword这看起来a)非常不安全,b)如果我想为成千上万的用户存储此类信息,它就无法工作。推荐的方法是什么?我希望能够在这些服务之上构建一个界面,因此每次用户进行交易时都必须输入凭据是不可行的。