IOS开发 日常踩坑记录

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__ : @""; \
        [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd \
        object:self file:__assert_file__ \
            lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \
    }               \
        __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \
    } while(0)
#endif

你可能感兴趣的:(IOS开发 日常踩坑记录)