Making NSAssert Play Nice With Blocks

NSAssert is actually a macro that calls NSAssertionHandler using the handleFailureInMethod:object:file:lineNumber:description method with self as the argument for object. This is fine and dandy for most asserts, but if you’re in a block, you probably just made a retain cycle.

Luckily this is pretty easy to fix by logging the function instead of the object:

#if !defined(NS_BLOCK_ASSERTIONS)

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

#else // NS_BLOCK_ASSERTIONS defined

#define BlockAssert(condition, desc, ...) 

#endif

This new macro behaves the same and will compile out with the same flags as NSAssert.

Easy, Peasy.

Updated: