How to know if NSAssert is disabled in release builds?

前端 未结 7 735
长发绾君心
长发绾君心 2020-12-04 11:22

I often saw \"assert \" in iOS code, I google it, and got to know it assert true or false.

I want to know if this will auto disable in release mode?

相关标签:
7条回答
  • 2020-12-04 11:45

    Here's what I do at the top of my main():

    #if defined(NDEBUG)
    {
      // The assertion code below should be compiled out of existence in a release
      // build.  Log an error and abort the program if it is not.
      bool ok = true;
      NSCAssert(ok = false, @"NS assertions should be disabled but are not");
      if (!ok)
      {
        NSLog(@"Detected release build but NS_BLOCK_ASSERTIONS is not defined");
        return -1;
      }
    }
    #endif
    

    Note that since main() is a C function and not an Objective-C function, NSCAssert is used above rather than NSAssert. (NSAssert expects self to be valid.)

    0 讨论(0)
  • 2020-12-04 11:46

    Update: Verified this works in Xcode 8 as well.

    In Xcode 7, go into the project build settings and search for "Assert" in the search bar. This shows section "Apple LLVM 7.0 - Preprocessing" section. There is a setting named "Enable Foundation Assertions".

    I have successfully enabled/disabled NSAssert from there.

    0 讨论(0)
  • 2020-12-04 11:56

    As Zaph said -DNS_BLOCK_ASSERTIONS=1 is set for release. However, if you wanted to check this.

    First observe in the docs that NSAssert is disabled by the macro NS_BLOCK_ASSERTIONS. Then add this to the build and observe it complies ok:

    #ifdef NS_BLOCK_ASSERTIONS
    #error Error - NS_BLOCK_ASSERTIONS is defined
    #endif
    

    Then change the scheme to release (cmd - shift - <)

    enter image description here

    Then observe that the build fails. Therefore NS_BLOCK_ASSERTIONS is defined meaning NSAsserts are disabled.

    0 讨论(0)
  • 2020-12-04 11:59

    I will here provide a meta-answer:

    Both @CocoaFu and @dasblinkenlight are correct. NS_BLOCK_ASSERTIONS turns off NSAssert() and NDEBUG turns off assert(). You need both if you use both.

    0 讨论(0)
  • 2020-12-04 12:00

    Now, as of Xcode 6, the setting is ENABLE_NS_ASSERTIONS, which is set to 1 for Debug configurations and 0 for Release, by default.

    You can opt into it for Release builds on the command line by passing the ENABLE_NS_ASSERTIONS=1 argument, which I'm doing for running unit tests that check for assertion conditions, but otherwise should run with the DEBUG flag off.

    0 讨论(0)
  • 2020-12-04 12:09

    Asserts are conditionally compiled out of your code when NDEBUG is defined. If you define NDEBUG=1 in the corresponding build settings section, you will deactivate asserts in your code regardless of the release or debug mode.

    0 讨论(0)
提交回复
热议问题