Block 内部使用NSAssert导致的循环引用的问题
[self test:^{
NSAssert(parameter,@"parameter can not be nil.");
}]
在block中使用NSAssert会导致循环引用,因为NSAssert宏中使用了强引用self, 在外面声明成weakself也没有用,因为block里的NSAssert引用的strong self。
解决方法:使用NSCAssert()代替NSAssert()
#define NSAssert(condition, desc, ...) \
do { \
__PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \
if (__builtin_expect(!(condition), 0)) { \
NSString *__assert_file__ = [NSString stringWithUTF8String:__FILE__]; \
__assert_file__ = __assert_file__ ? __assert_file__ : @"<Unknown File>"; \
[[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd \
object:self file:__assert_file__ \
lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \
} \
__PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \
} while(0)
#endif