美文网首页
如何优雅地清空单例的属性值

如何优雅地清空单例的属性值

作者: tp夕阳武士 | 来源:发表于2018-10-11 17:51 被阅读60次

1.有漏洞的写法

- (void)rfClearPropertyValue {
        //1.存储属性的个数
        unsigned int propertyCount = 0;
        // 2.通过运行时获取当前类的所有属性
        objc_property_t *properties = class_copyPropertyList([self class], &propertyCount);
        // 3.遍历属性
        for (int i = 0; i < propertyCount; i ++) {
            objc_property_t property = properties[i];
            NSString *propertyName = [NSString stringWithFormat:@"%s", property_getName(property)];
            // 4.利用KVC 设置属性nil
            [self setValue:nil forKey:propertyName];
        }
        // 释放指针
        free(properties);
}

如果你的运气足够好,单例中所有的属性都是非基础类型,那么这么写是可以的,但是如果属性中有基础类型属性的时候(例如,int NSInterger),那么你会看到运行奔溃提示:could not set nil as the value for the key

2.升级版写法

- (void)clearPropertyValue {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        unsigned int propertyCount = 0;
        // 2.通过运行时获取当前类的所有属性
        objc_property_t *properties = class_copyPropertyList([self class], &propertyCount);
        // 3.遍历属性
        for (int i = 0; i < propertyCount; i ++) {
            objc_property_t property = properties[i];
            NSString *propertyName = [NSString stringWithFormat:@"%s", property_getName(property)];
            // 4.利用KVC 设置属性nil
            @try {
                [self setValue:nil forKey:propertyName];
            } @catch (NSException *exception) {
                [self setValue:@0 forKey:propertyName];
            } @finally {
                //
            }
        }
        // 释放指针
        free(properties);
    });//此处使用在子线程中实现重置单例属性的写法,因为在block中使用此方法时有死锁的情况;
}

*注:本文内容来自于简述作者:@yannChee, 本文章只是在原作者写法上把开辟子线程的写法调整到方法内部,原文:<<利用Runtime清空单例属性>>

相关文章

  • 如何优雅地清空单例的属性值

    1.有漏洞的写法 如果你的运气足够好,单例中所有的属性都是非基础类型,那么这么写是可以的,但是如果属性中有基础类型...

  • Swift 单例传值

    回顾 Objc 创建单例的方式: 1.创建单例 2.给单例的属性赋值 3.输出单例的属性值

  • 单例模式

    1.属性值可修改的单例模式 2.属性值不可修改的单例模式 优缺点: 优点: 在单例模式中,活动的单例只有一个实例,...

  • 利用Runtime清空单例属性

    但是上面代码有一个重大bug: 当对象里面的属性不是对象属性时(例如NSInteger CGFloat等),程序会...

  • 项目问题随笔记录(version 1.2.3更新)

    1.做一个身份条件判断的时候用自定义单例保存BOOL值,但是每次重新运行程序自定义单例的数据值就会清空!! 原因:...

  • iOS页面传值——六大方式汇总

    *对比总结了页面传值六种方式,以便更好地记忆和应用:1、属性传值2、单例传值3、NSUserDefaults传值4...

  • 如何优雅地手写单例模式

    单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。正是因为简单,也成为面...

  • Alamofire-后台下载

    1、枚举 HTTPMethod rawValue属性值关联 2、单例 SessionManager.default...

  • iOS 传值方法(属性传值、代理传值、Block、通知、单例)

    iOS 传值方法(属性传值、代理传值、Block、通知、单例)简单的介绍一下几个传值方式 1、属性传值 在传值的时...

  • iOS的五种传值

    前言 iOS常见的五种传值分别为属性传值,通知传值,代理传值,block传值,单例传值 属性传值 用于正向传值,简...

网友评论

      本文标题:如何优雅地清空单例的属性值

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