【iOS】关于单例类中清空自身属性

  • 最近做项目中,遇到这样一个问题:用户信息存在一个单例中,当用户退出登录时,要清空整个用户的属性,本文使用了如下的解决方案
/**
 清空属性值
 */
- (void)cleanWithAllProperties {
    unsigned int pro_count = 0;
    // 获取该类中所有属性列表
    objc_property_t *properties = class_copyPropertyList([self class], &pro_count);
    // for循环遍历所有属性
    for (int i = 0; i < pro_count; i ++) {
        objc_property_t property = properties[i];
        // 得到当前属性的名字(字符串形式)
        NSString *propertyName = [NSString stringWithFormat:@"%s", property_getName(property)];
        // 使用KVC方式得到该属性的值
        id propertyValue = [self valueForKey:(NSString *)propertyName];
        
        // null的就不用管了
        if (!propertyValue ||
            [propertyValue isKindOfClass:[NSNull class]]) {
            continue;
        }
        
        // !!!:同样通过KVC的方式赋值

        if ([propertyValue isKindOfClass:[NSString class]]) {
            // 字符串类型
            [self setValue:@"" forKey:propertyName];
            NSLog(@"--> 清理用户信息[%@]成功 NSString:%@",propertyName,propertyValue);
        }
        else if ([propertyValue isKindOfClass:[NSNumber class]]) {
            // bool int float long ...
            [self setValue:[NSNumber numberWithInteger:0] forKey:propertyName];
            NSLog(@"--> 清理用户信息[%@]成功 NSNumber:%@",propertyName,propertyValue);
        }
        else if ([propertyValue isKindOfClass:[NSMutableDictionary class]] ||
                 [propertyValue isKindOfClass:[NSDictionary class]]) {
            // 字典
            [self setValue:@{} forKey:propertyName];
            NSLog(@"--> 清理用户信息[%@]成功 NSDictionary:%@",propertyName,propertyValue);
        }
        else if ([propertyValue isKindOfClass:[NSMutableArray class]] ||
                 [propertyValue isKindOfClass:[NSArray class]]) {
            // 数组
            [self setValue:@[] forKey:propertyName];
            NSLog(@"--> 清理用户信息[%@]成功 NSArray:%@",propertyName,propertyValue);
        }
        else {
            // 其他未知类型 包括data
            // 这里还可以增加其他判断...
            [self setValue:nil forKey:propertyName];
            NSLog(@"--> 清理用户信息[%@]成功 其他未知类型:%@",propertyName,propertyValue);
        }
    }
    // 释放
    free(properties);
    
    /*
    // 置空父类(PowerStationForHouseholdModel)的属性值
    pro_count = 0;
    objc_property_t *properties_super = class_copyPropertyList([self superclass], &pro_count);
    for (int i = 0; i < pro_count; i ++) {
        objc_property_t property = properties_super[i];
        NSString *propertyName = [NSString stringWithFormat:@"%s", property_getName(property)];
        // 可以自己根据要求修改
        [self setValue:nil forKey:propertyName];
    }
    free(properties_super);
     */
}

// 如果属性和字典中的key不一致,可以重写此方法 / 或者readonly
// 不一致的key和对应的value都会通过这个方法返回,可以在此方法中做特殊处理
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    NSLog(@"-------> forUndefinedKey:%@  value:%@",key,value);
}

拓展:可以通过这种思路拓展到一键设置属性,方便管理,等等

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,812评论 25 709
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,219评论 6 13
  • 文/凡人青衫 01 我的朋友团子刚刚发来一行字:今天被同事问以前是不是穷怕了,感觉十分委屈。 隔着屏幕都能感觉她的...
    凡人青衫阅读 544评论 3 7
  • 2012.8.15 晴 韶关——即使没人相信,你也不要绝望!很喜欢海子的一句话“要有最朴素的生活和最遥远的梦想,...
    37分贝的鲸鱼阅读 156评论 0 1
  • 旭日东升,几丝阳光突破黑夜的漫长阵线,把整个世界带向了光明。而黑夜做着垂死的挣扎,依然拿起武器抵抗正义的...
    竹鸿初阅读 703评论 1 1