NS_BLOCK_ASSERTIONSが有効のとき可変長引数のNSAssertが未定義になる

NSCAssertも同様。これは一体どういう意図があるんだろう。それとも単なるバグなのか。

NSBLOCKASSERTIONSが無効のとき

#if !defined(NS_BLOCK_ASSERTIONS) && defined(__STDC_VERSION__) && (199901L <= __STDC_VERSION__) && (defined(__GNUC__) || 0)

#if !defined(_NSAssertBody)

#define NSAssert(condition, desc, ...) \
    do {            \
    if (!(condition)) { \
        [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd \
        object:self file:[NSString stringWithUTF8String:__FILE__] \
            lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \
    }           \
    } while(0)

#define NSAssert1(condition, desc, arg1) NSAssert((condition), (desc), (arg1))
#define NSAssert2(condition, desc, arg1, arg2) NSAssert((condition), (desc), (arg1), (arg2))
#define NSAssert3(condition, desc, arg1, arg2, arg3) NSAssert((condition), (desc), (arg1), (arg2), (arg3))
#define NSAssert4(condition, desc, arg1, arg2, arg3, arg4) NSAssert((condition), (desc), (arg1), (arg2), (arg3), (arg4))
#define NSAssert5(condition, desc, arg1, arg2, arg3, arg4, arg5) NSAssert((condition), (desc), (arg1), (arg2), (arg3), (arg4), (arg5))

#define NSParameterAssert(condition) NSAssert((condition), @"Invalid parameter not satisfying: %s", #condition)

#endif

NSBLOCKASSERTIONSが有効のとき

#if !defined(NSAssert)
#define NSAssert5(condition, desc, arg1, arg2, arg3, arg4, arg5)    \
    _NSAssertBody((condition), (desc), (arg1), (arg2), (arg3), (arg4), (arg5))

#define NSAssert4(condition, desc, arg1, arg2, arg3, arg4)  \
    _NSAssertBody((condition), (desc), (arg1), (arg2), (arg3), (arg4), 0)

#define NSAssert3(condition, desc, arg1, arg2, arg3)    \
    _NSAssertBody((condition), (desc), (arg1), (arg2), (arg3), 0, 0)

#define NSAssert2(condition, desc, arg1, arg2)      \
    _NSAssertBody((condition), (desc), (arg1), (arg2), 0, 0, 0)

#define NSAssert1(condition, desc, arg1)        \
    _NSAssertBody((condition), (desc), (arg1), 0, 0, 0, 0)

#define NSAssert(condition, desc)           \
    _NSAssertBody((condition), (desc), 0, 0, 0, 0, 0)
#endif

意図的にやってるとしてもメリットが分からない。油断してNSAssert(condition, desc, ...)を開発時に使いまくって、いざNSBLOCKASSERTIONS付きでreleaseビルドすると悲惨なことになる。

Written on July 26, 2011