2014-02-24 167 views
2

我創建了兩個應用程序,稱它們爲服務器和客戶端。這兩個應用程序的xcode項目都使用通用的子項目。這些應用程序是爲特定客戶設計的,可在iOS7/iPad上運行正確處理32/64位

爲了進行測試,我正在編譯服務器應用程序並在iPad 3上運行它。客戶端應用程序在Air上運行。當我爲iPad3編譯時,Xcode引發了一堆警告,因爲NSInteger/NSUInteger類型爲32位,我使用的邏輯(在這種情況下,格式爲%lu的NSString)抱怨(因爲它是爲64位)

但更麻煩的是,我使用NSKeyArchiving將數據從一個iPad打包發送到另一個 - 我猜如果存儲在這些類型的數據超過32位,我會遇到問題。

它看起來像我需要在另一個基本類型,如UInt32而不是NSUInteger標準化 - 是正確的方法?任何其他提示?

編輯: 這裏有一個例子:

+ (NSUInteger)nextTransactionNumber 
{ 
    static int64_t currentTransactionNumber = 0; 
    OSAtomicIncrement64(&currentTransactionNumber); 
    return currentTransactionNumber; 
} 

編譯沒有爲64位,但對回報32位的悲傷。那麼我最好使用Uint32?

+0

您應該能夠在前面放置(長)來解決這個問題的整數 - 免費橋接將消除32位問題 大多數時候。 – AMayes

+0

如果在機器之間發送任何數據,即使不順從,最好標準化大小(uint32_t,uint64_t)和字節順序(使用ntohl,ntohs等)。 – Linuxios

回答

0

NSNumber是一個不錯的選擇。

你可以序列化,反序列化,打印所有沒有32/64位問題(這是除非你打算處理大於40億的數字)。

NSNumber *number = @1000U; 

要打印出:

NSString *string = [NSString stringWithFormat:@"%@", number]; 

進行計算:

NSUInteger value = [number unsignedIntegerValue]; 

存檔:

- (void)encodeWithCoder:(NSCoder *)encoder { 
    // … 
    [encoder encodeObject:self.number forKey:@"number"]; 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
    self = [super init]; 
    if (self) { 
     // … 
     _number = [decoder decodeObjectForKey:@"number"]; 
    } 
    return self; 
} 
+0

謝謝@Jeffery,我在我的應用程序的其他地方使用了它,但不要單獨使用它 - 寧願使用encodeInt64。你是否建議在整個過程中使用NSNumber抽象是一種更好的模式? – 300baud

+1

@ 300baud Well NSNumber,NSInteger,CGFloat等都支持64位和32位。我只是使用這些來防止任何性能影響。一個很好的問題是這樣的:http://stackoverflow.com/questions/4445173/when-to-use-nsinteger-vs-int –

+0

@ 300baud NSNumber在存儲和維護方面爲您完成所有工作。如果你需要一個對象來保存一個數字,這是一個很好的選擇。 –