objective-c 动态添加属性

本文介绍了在Objective-C中如何使用关联值动态添加属性,以解决在类中声明过多变量的问题。通过一个简单的NSObject分类实现,展示了如何将动态属性存储在字典中,并附带了一个测试案例来验证动态添加属性的成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

项目开发中经常会申明变量保存相关相关值,但是对于功能太多的类中申明过多的变量看着就非常的繁琐,尤其是使用动态语言如javaScript 写过功能的都知道,动态语言可以动态的在一个对象上添加新的属性和值,这将是非常有诱惑力的功能,而且objective-c 的动态特性是非常强大的

oc 关联值

/** 
 * Sets an associated value for a given object using a given key and association policy.
 * 
 * @param object The source object for the association.
 * @param key The key for the association.
 * @param value The value to associate with the key key for object. Pass nil to clear an existing association.
 * @param policy The policy for the association. For possible values, see “Associative Object Behaviors.”
 * 
 * @see objc_setAssociatedObject
 * @see objc_removeAssociatedObjects
 */
objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy)


 /** 
     * Returns the value associated with a given object for a given key.
     * 
     * @param object The source object for the association.
     * @param key The key for the association.
     * 
     * @return The value associated with the key \e key for \e object.
     * 
     * @see objc_setAssociatedObject
     */
objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key)

以上两个oc 函数可以实现给给定对象设置关联值。但是查看相关api可知其中的key 是const void * 修饰的,也就是说给定的key 只能是同一个地址处的内容,对于多次添加需要定义多个key,这也是相当繁琐。故我们可以设置一个NSMutableDictionary 为对象的关联值,把需要动态设置的值保存到字典中即可。

新建NSObject 分类 NSObject+Ext.h 文件

//类似动态语言可以动态添加 键值对
@interface NSObject (Value)

//set value with nil will remove
-(void)zl_bindValue:(id)value forKey:(NSString *)key;

-(id)zl_value:(NSString *)key;

-(NSArray<NSString *> *)zl_keys;

//清空所有数据
-(void)zl_clearAll;
 
@end

NSObject+Ext.m

#import "NSObject+Ext.h"
#import <objc/runtime.h>

@implementation NSObject (Value)

static const char *cache_key = "$map_$cache_$object_$map_$key";


-(NSMutableDictionary *)zl_value_map:(BOOL)create{
    NSMutableDictionary *map = objc_getAssociatedObject(self, cache_key);
    if(map == nil && create){
        map = [NSMutableDictionary dictionaryWithCapacity:16];
        objc_setAssociatedObject(self, cache_key, map, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return map;
}

-(void)zl_bindValue:(id)value forKey:(NSString *)key{
    [self zl_value_map:YES][key] = value;
}

-(id)zl_value:(NSString *)key{
    return [self zl_value_map:NO][key];
}

-(NSArray<NSString *> *)zl_keys{
    
    return [self zl_value_map:NO].allKeys;
}

-(void)zl_clearAll{
    [[self zl_value_map:NO] removeAllObjects];
}

@end

测试

在这里插入图片描述

由上图可知动态添加属性成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值