2011-01-07 67 views
2

我從MPMediaPickerController獲取媒體項目的ID。根據文檔,該值是一個包含uint64_t(unsigned long long)的NSNumber對象。我想將其轉換爲NSString以保存在我的數據模型中。但是,當我將它轉換爲字符串時,它的值發生了變化,當我將它轉換回數字時,它會再次發生變化!顯然,我不瞭解這些數據類型的一些東西。你能幫我嗎?需要幫助將MPMediaItemPropertyPersistentID轉換爲字符串,然後再返回

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值在轉換中存活,有些則不存在。

回答

6

你說這個首發:

NSLog(@"id as number: %qu", [mediaPicked valueForProperty:MPMediaItemPropertyPersistentID]); // outputs 566042331449280 

但是,這是錯誤的。 %qu表示「這個東西是一個無符號的long long」。但是這個東西是不是一個unsigned long long。這是一個對象!這是一個NSNumber 纏繞着一個無符號long long。你對NSLog說謊,所以你在第一個語句中得到垃圾輸出。

現在,試試這個你自己的機器上:

uint64_t x = 16204893883745507648ULL; 
NSLog(@"%qu", x); 
NSNumber* n = [NSNumber numberWithUnsignedLongLong:x]; 
NSLog(@"%@", n); 
NSLog(@"%@", [n stringValue]); 

所有這些的NSLog語句產生相同的結果 - 因爲他們是正確的配方,不像你開始與一個。所以,那些NSLog語句顯示了你應該說的那種東西。

現在,你可能會想:哦,太棒了,所以我可以從NSNumber到NSString,畢竟stringValue。是的,但你不能再回來。我們無法使用longlongValue[n stringValue]獲得正確的NSNumber,因爲long long不是無符號long long。沒有unsignedLonglongValue。所以你不能從這裏到達。

那麼什麼是正確的做法?根本不要轉換!你有一個NSNumber,它是有效的,只是保留它並使用它。 NSNumber是您可以存儲在模型中的值。 (例如,它可以作爲一個值或作爲一個關鍵字進入字典,它可以是一個用戶默認值,等等。)

+0

我有一種感覺我越來越差的輸出,但「NSNumber包裹圍繞一個未簽署的長期合同「將我拋棄。如果我將NSLog更改爲使用%@而不是%qu,那麼我可以看到使用stringValue從原始NSNumber轉換爲NSString沒有問題。但是,正如你所說,沒有可比較的方式將NSString轉換回NSNumber。但是,隨着我的問題更好的定義,我做了一些更多的搜索,並在這裏找到了一個替代方案:http://stackoverflow.com/questions/1181637/storing-and-retrieving-unsigned-long-long-value-to-from-nsstring 。謝謝你的幫助! – arlomedia 2011-01-07 16:46:05

相關問題