2 ericarlene ericarlene 于 2016.04.25 16:47 提问

iOS中在类别中动态新增了的可变字典属性变成了不可变字典

想在category中新增个属性来用,创建的可变字典属性,也做了相关关联,结果用不了setobject方法,打印出来一看发现变成了不可变字典类型,希望有大神帮我看看哪里出问题了:

static void *myAllPropertiesDicKey = &myAllPropertiesDicKey;

@implementation FatherClass (Category)
//add setter and getter method in runtime
-(void)setMyAllPropertiesDic:(NSMutableDictionary *)myAllPropertiesDic{
objc_setAssociatedObject(self, & myAllPropertiesDicKey, myAllPropertiesDic, OBJC_ASSOCIATION_COPY);
}

-(NSMutableDictionary )myAllPropertiesDic{
return objc_getAssociatedObject(self, &myAllPropertiesDicKey);
}
//
-(instancetype)initByAllPropertiesInMyDictionary{
if (self = [super init]) {
//declare a variable to save the number of properties
unsigned int count;
//get all the properties
objc_property_t
properties = class_copyPropertyList([self class], &count);
//init the mutabledictionary used to save all properties
self.myAllPropertiesDic = [[NSMutableDictionary alloc]initWithCapacity:count];
//deal with each property
for (int i=0; i<count; i++) {
objc_property_t property = properties[i];
const char* char_f = property_getName(property);
NSString* propertyName = [NSString stringWithUTF8String:char_f];
id propertyValue = [self valueForKey:propertyName];
if (![propertyName isEqualToString:@"myAllPropertiesDic"]) {
if ([self.myAllPropertiesDic isKindOfClass:[NSMutableDictionary class]]) {
NSLog(@"可变");
}else if ([self.myAllPropertiesDic isKindOfClass:[NSDictionary class]]){
NSLog(@"不可变");
}else{
NSLog(@"p都不是");
}
[self.myAllPropertiesDic setObject:propertyValue?propertyValue:[NSNull null] forKey:propertyName];
[self addObserver:self forKeyPath:propertyName options:NSKeyValueObservingOptionNew context:nil];
}
}
free(properties);

}

return self;

}
打印出来是:2016-04-25 16:31:36.551 test2[1375:54201] 不可变
第一次发问题,谢谢大家了

1个回答

wang631106979
wang631106979   2016.04.29 10:25

你用runtime创建字典是用的是copy修饰符导致你的字典是不可变,应该用strong修饰符,改了就好用了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
OC中可变字典和不可变字典
#import int main(int argc, const char * argv[]) { //不可改变字典,创建后不可改变 NSDictionary * dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"jack",@"name",@"18",@"age", nil]; NSLog(@"%@",d
NSArray,NSDictionary的常用方法与可变数组可变字典的常用方法
-- NSArray 1. objectAtIndex:index    访问数组中某个元素 NSArray *array = @[@"元素1", @"元素2"]; NSLog(@"数组中的元素:%@", [array objectAtIndex:1]);运行结果:元素2 2. indexOfObject:(String)   根据数组对象 ,返回对象的下标
OC_字典(可变不可变都有^_^)
字典 NSDictionary1.概念字典是关键字'key'及其定义的值(value)所构成的集合,即它是由key-value组成的键值对的集合。 'key'一般是'NSString'类型的,‘value’是OC中任意对象。对于字典来讲,我们就是通过'key'来访问 'value'。 2.为什么在有了数组之后还需要字典?在有大量的数据或者频繁的查找的时候
iOS开发之 字典和可变字典初解
一、字典 字典 : 字典是由键值对组成的数据集合,key是字符串对象,值可以是其他任意类型,在一个字典中,key必须是唯一的。此外,字典对象的键和值不可以为空,如果需要在一个对象中表示一个控制,可以使用NSNull对象  字典是通过key来取值的   为什么要使用字典?为什么不适用数组?   数组特征: 数组是按照一定顺序取排列的集合,通过下标取存取值(当希望数据是按照一定的顺序去
OC的不可变字典以及可变字典
相对数组而言,字典是无序的一个集合。字典的概念:字典是由关键字’key’及其’value’所构成的无序集合。即它由key-value组成的键值对的集合。’key’一般是NSString类型,’value’是OC中的任意对象。对于字典,我们就是通过’key’来访问相应的’value’。 字典同样有不可变字典(NSDictionary)和可变字典(NSMutableDictionary)。 1.不可
可变字典(NSDictionary)与不可变字典(NSMutableDictionary)
字典 :key与value组合成的键值对的集合 特点: 无序的 ,存的都是对象类型NSDictionary的创建1.NSDictionary *dic=[NSDictionary dictionary]2.NSDictionary *dic=[NSDictionary dictionaryWithObject:@"展昭" forKey:@"包拯"];3.NSDictionary *dic2=[NS
python(四)字典,集合,可变与不可变对象(下)
摘要 python中的字典类似于js中的json,其实就实现方式来看确切的说python中的字典才真正的像php中的数组,所以我说的list和php中的数组类似及dict和json类似,仅仅是指形式上~ 1,集合 python中的集合,可以和列表相比较,因为它们只存储key,而不存储value,但是列表有序而集合无序。同时它还可以和字典比较,因为集合和字典的实现方式一样,原因是在集
OC语言-字典与可变字典的定义及字典的嵌套
一、字典的定义 不可变字典 1.NSDictionary(不可变字典), NSMutableDictionary(可变字典)是由键-值对组成的数据集合。 2.通过key(键),查找对应value(值)。key通常是字符串对象,值可以是其他任意类型对象。在一个对象中,key的值必须是唯一的。 注意:字典对象的键和值不可以为空(nil),如果需要在一个字典对象中表示一个空值,可以使用NSNul
python(三)字典,集合,可变与不可变对象(上)
摘要 python中的字典类似于js中的json,其实就实现方式来看确切的说python中的字典才真正的像php中的数组,所以我说的list和php中的数组类似及dict和json类似,仅仅是指形式上~ 1,字典 python中的字典,对!就是你想到的现实中的那个“字典”! 就实现方式来看,所有的这种map结构,本质上都是基于key-value这种结构,key就是你的“字典的
Python中的可变与不可变类型
首先,我们需要知道在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来...