需要帮助将MPMediaItemPropertyPersistentID转换为字符串然后再返回

时间:2011-01-07 02:48:24

标签: objective-c ios4 types

我从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值在转换后仍然存在,而另一些则没有。

1 个答案:

答案 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是您可以存储在模型中的值。 (例如,它可以作为值或作为键进入字典,它可以是用户默认值中的值,依此类推。)