2015-10-14 37 views
3

我得到這樣的警告以下行的代碼:的Xcode警告:格式指定型「長」但參數的類型爲「INT _Nullable」

NSLog(@"selected segment: %li", _segmentControl.selectedSegmentIndex); 

酒店selectedSegmentIndexNSInteger類型。

如果我改變格式%i我得到以下警告:

Format specifies type 'int' but the argument has type 'long _Nullable' 

是否有可空類型的任何新的格式說明或者這只是一個錯誤在Xcode 7?

回答

18

你應該輸入:

NSLog(@"selected segment: %li", (long)_segmentControl.selectedSegmentIndex); 

由於NSInteger的具有在32和64位架構不同的長度。以前你沒有看到警告,因爲可能你只是針對64位體系結構進行編譯。


我還建議閱讀Apple Article,因爲有在Xcode 7個新符(除其他nullablenonnull)。


要從評論回答您的疑問,請參閱本Apple document,他們聲明如下:

類型說明符

腳本動作:警告潛在的問題;可能會產生誤報。

通常,在32位代碼中,您可以使用%d說明符在函數(如printf,NSAssert和NSLog)中以及在諸如stringWithFormat之類的函數中格式化int 值。但是使用NSInteger,64位的 體系結構的大小與長度相同,因此需要使用%ld 說明符。除非您構建的是32位類似的64位,否則這些 說明符會在32位模式下生成編譯器警告。爲了避免這個問題,你可以將這些值轉換爲long或unsigned long,因爲 是合適的。例如:

NSInteger i = 34; 
printf("%ld\n", (long)i); 
+0

那麼這會使警告消失,但iOS在64位上已經有一段時間了,而我不記得必須在NSLog中輸入參數。過去,將格式說明符從%i更改爲%li就足夠了。 – bbjay

+1

@bbjay請修改我更新的答案,我在這裏粘貼了蘋果公司的代碼片段。他們也這樣做。警告總是在那裏。你可能編譯的主要是64位,所以你沒有看到這個警告。如果你已經編譯過32位,你以前就會看到它。唯一的區別是,在Xcode 7中,警告始終可見,不依賴於目標架構。 – Vive

+0

確實。原因是架構的構建設置默認爲'ARCHS =「$(ARCHS_STANDARD)」;'Xcode 7中的值爲'armv7,arm64'。你能在你的答案中包含這些信息嗎?那麼我會很樂意接受它。 – bbjay

0

只想補充: 我得到這個警告「突然」即使我沒有改變做了很長一段時間警告的代碼,我不明白爲什麼它的出現。

原因:「通用iOS設備」。當選擇設備或模擬器時,警告消失。

還是,我在NSLog中添加了「(long)」這個變量。直到那時我只有「%ld」,無論選擇什麼東西(通用設備,真實設備,模擬器),都會發出警告

相關問題