我从MPMediaPickerController获取媒体项的ID。根据文档,此值是包含uint64_t(unsigned long long)的NSNumber对象。我想将其转换为NSString以保存在我的数据模型中。但是,当我将其转换为字符串时,其值会发生变化,当我将其转换回数字时,它会再次更改!显然,我对这些数据类型并不了解。你能帮忙吗?
MPMediaItem *mediaPicked;
// set mediaPicked to an MPMedia item using MPMediaPickerController...
NSLog(@"id as number: %qu", [mediaPicked valueForProperty:MPMediaItemPropertyPersistentID]); // outputs 566042331449280
NSLog(@"id as string: %@", [[mediaPicked valueForProperty:MPMediaItemPropertyPersistentID] stringValue]); // outputs 16204893883745507648
NSLog(@"id as number: %qu", [[[mediaPicked valueForProperty:MPMediaItemPropertyPersistentID] stringValue] longLongValue]); // outputs 9223372036854775807
如果我尝试在此转换之前播放媒体项目,它始终有效。但是如果我在转换后尝试播放媒体项目,那么我尝试过的媒体项目中只有大约一半可以使用。因此,一些ID值在转换后仍然存在,而另一些则没有。
答案 0 :(得分:6)
你首先要这样说:
NSLog(@"id as number: %qu", [mediaPicked valueForProperty:MPMediaItemPropertyPersistentID]); // outputs 566042331449280
但那是错的。 %qu的意思是“这个东西是一个无符号长长的”。但是这个东西不是一个无符号的long long。这是一个对象!这是一个NSNumber 缠绕一个无符号的长整数。你在骗NSLog,所以你在第一个声明中得到了垃圾输出。
现在,在您自己的机器上试试这个:
uint64_t x = 16204893883745507648ULL;
NSLog(@"%qu", x);
NSNumber* n = [NSNumber numberWithUnsignedLongLong:x];
NSLog(@"%@", n);
NSLog(@"%@", [n stringValue]);
所有这些NSLog语句都给出了相同的结果 - 因为它们都是正确的表达方式,与您开始时不同。所以,那些NSLog语句向你展示了你应该说的那种东西。
现在,您可能会想:哦,太好了,所以我可以从NSNumber到stringValue
的NSString。是的,但你不能再回来了。我们无法使用[n stringValue]
从longlongValue
获取正确的NSNumber,因为long long不是unsigned long long。没有unsignedLonglongValue
。所以你不能从这里到达那里。
那么正确的做法是什么?根本不转换!你有一个NSNumber,它是有效的,只需保留并使用它。 NSNumber是您可以存储在模型中的值。 (例如,它可以作为值或作为键进入字典,它可以是用户默认值中的值,依此类推。)