2011-06-03 22 views
7

Ben NSAssertprintf belirteçleri kullanamadı, ama bu: beklediğinizNSAssert1, vb NSAssert yerine neden?

NSAssert(0, @"%@%@", @"foo", @"bar"); 

çalışır gibi:

*** Assertion failure in -[MyClass myMethod], <Path>/MyClass.m:84 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
    reason: 'foobar' 

ne zaman NSAssertNSAssert1, NSAssert2 vb kullanmanın ne anlamı var Eserleri?

Bu, Xcode 4.0 ve iOS 4.3 SDK ile önemlidir. (Eğer değilse, etiketleri güncelleyeceğim.)

cevap

17

NSAssert()'un şu anki sürümleri, preprocessor variadic makrolarını, yani __VA_ARGS__'u kullanır. variadic makrolar bir C99 özellikler olduğundan, benim tahminim SDK eski sürümleri, NSAssert() değişken argümanları izin NSAssert1(), NSAssert2() için dolayısıyla ihtiyaç vb vermedi olmasıdır

Eğer

NSAssert(0, @"%@%@", @"foo", @"bar"); 
derlemeye çalışırsanız o morina için

error: too many arguments provided to function-like macro invocation 
    NSAssert(0, @"%@%@", @"foo", @"bar"); 

: -std=c89 veya -ansi (ISO C90, variadic makro desteklemeyen C daha eski bir sürüm) kullanarak

, bir derleyici hatası alıyorum E -std=c89 veya -ansi ile derlemek için NSAssert2() kullanmak gerekir: Bavarious By

NSAssert2(0, @"%@%@", @"foo", @"bar"); 
0

Mükemmel Cevap.

Tek bitimi buna ekliyorum. Sorunla karşılaşan insanlar için Too many arguments provided to function-like macro invocation. @Bavarious tarafından -std=c89 tarafından belirtilen bölümüne dikkat edin.

Sorundan nasıl kurtuldum. ayarlarını inşa etmek

  1. Git -> Apple LLVM 6.1
  2. Bul C dili lehçesi
  3. Değişim -std=c99-
İlgili konular