美文网首页
iOS NSAssert 一不小心就循环引用了,注意

iOS NSAssert 一不小心就循环引用了,注意

作者: 踩坑小分队 | 来源:发表于2019-11-29 12:57 被阅读0次

NSAssert 和 NSCAssert是我们经常使用的两个断言的宏定义

NSCAssert 的定义如下:

#define NSCAssert(condition, desc, ...) \
    do {                \
    __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \
    if (__builtin_expect(!(condition), 0)) {        \
            NSString *__assert_fn__ = [NSString stringWithUTF8String:__PRETTY_FUNCTION__]; \
            __assert_fn__ = __assert_fn__ ? __assert_fn__ : @"<Unknown Function>"; \
            NSString *__assert_file__ = [NSString stringWithUTF8String:__FILE__]; \
            __assert_file__ = __assert_file__ ? __assert_file__ : @"<Unknown File>"; \
        [[NSAssertionHandler currentHandler] handleFailureInFunction:__assert_fn__ \
        file:__assert_file__ \
            lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \
    }               \
        __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \
    } while(0)

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)

NSAssert,可以看到它的宏定义中出现了一个self。如果你在一个栈上的block回调中使用了NSAssert,无异于在里面直接用了self。循环引用了

例如:
下面的写法就存在内存泄露了

- (void)createUI
{
    ClickView *tempView = [[ClickView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    tempView.backgroundColor = [UIColor yellowColor];
    tempView.clickBlock = ^{
        
        NSAssert(条件判断, @"12345");
    };
    [self.view addSubview:tempView];
}

解决办法:

NSAssert 换成 NSCAssert

相关文章

  • iOS NSAssert 一不小心就循环引用了,注意

    NSAssert 和 NSCAssert是我们经常使用的两个断言的宏定义 NSCAssert 的定义如下: NSA...

  • ios Block之内存泄漏

    在使用block时引起强引用循环时会导致严重的内存泄漏,而大家要注意的是,循环强引用的条件是block中引用了强引...

  • IOS开发 日常踩坑记录

    Block 内部使用NSAssert导致的循环引用的问题

  • 断言

    在iOS开发中,可以使用宏NSAssert()在程序中进行断言处理。NSAssert()使用正确,可以帮助开发者尽...

  • 关于iOS8之后的alertcontroller

    填坑计 注意 执行 等于是alert引用了action如果在actiong的block里面调用alert就循环引用了

  • NSAssert()使用目的

    转自iOS开发中断言的使用—NSAssert()[https://blog.csdn.net/univcore/a...

  • sendEmptyMessageAtTime和sendEmpty

    场景:想实现一个每隔1s就循环发送消息的功能,没注意用了sendEmptyMessageAtTime,结果程序跑了...

  • iOS开发NSAssert使用

    NSAssert()只是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来判定是否...

  • iOS NSAssert知多少?

    1、什么是NSAssert? NSAssert ,断言,其实是一个宏,主要用于开发阶段调试程序,在真机中将会自动忽...

  • iOS开发 NSAssert(NO, @"attempting

    在使用Mansory添加约束时候,一不留神,报了这个错误 解决方法,查看断点下面这块代码,找到问题所在 tip:遇...

网友评论

      本文标题:iOS NSAssert 一不小心就循环引用了,注意

      本文链接:https://www.haomeiwen.com/subject/tlawwctx.html