Search code examples
objective-cxcodesuppress-warningsdesignated-initializer

Turn off designated initializer checking in Xcode 6


I'm getting the compile error:

error: convenience initializer missing a 'self' call to another initializer [-Werror,-Wobjc-designated-initializers]

Compile-checked designated initializers might be a good thing, but if I don't want deal with that right now, how can I turn this off?


Solution

  • Method 1

    In your project:

    1. Edit the build settings for your target (⌘-1, select project, or cf. Apple docs).
    2. Search for "Other warning flags". up in here, yo
    3. Add -Wno-objc-designated-initializers.

    You can also do some combination of this and -Wobjc-designated-initializers on a per file basis or with clang diagnostic pushes and pops (cf. @bandejapaisa's "Method 3" answer below).

    Method 2

    This method allows you to switch back and forth between Xcode 5 & 6, and also provides you a reminder to fix the designated initializer stuff.

    For iOS development, put this in your .pch (precompiled header) file:

    #ifdef __IPHONE_8_0
        // suppress these errors until we are ready to handle them
        #pragma message "Ignoring designated initializer warnings"
        #pragma clang diagnostic ignored "-Wobjc-designated-initializers"
    #else
        // temporarily define an empty NS_DESIGNATED_INITIALIZER so we can use now,
        // will be ready for iOS8 SDK
        #define NS_DESIGNATED_INITIALIZER
    #endif
    

    The analog to __IPHONE_8_0 for OS X 10.10 is __MAC_10_10.

    Why?

    If you are interested in why these messages exist, you can check out this SO answer or these Apple docs.