作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试处理和更改 NSDictionary 的键,同时保留相同的对象。最好的方法似乎是使用 -getObjects:andKeys:
s,修改键数组,然后用 +dictionaryWithObjects:forKeys:count:
创建一个新字典来重建词典。但是,对象和键的数组是 id __unsafe_unretained []
。有没有办法让我安全地将新的键对象分配到该数组中,或者我是否必须创建另一个数组 id __strong []
?
以下示例因最后一行出现 EXC_BAD_ACCESS 而崩溃:
NSDictionary *old = @{@"key1": @"foo", @"key2": @"bar"};
id __unsafe_unretained keys[2];
id __unsafe_unretained vals[2];
[old getObjects:vals andKeys:keys];
for (NSUInteger i = 0; i < 2; i++) {
keys[i] = [keys[i] uppercaseString];
}
NSDictionary *new = [NSDictionary dictionaryWithObjects:vals forKeys:keys count:2];
NSLog(@"New dict: %@", new);
最佳答案
你是对的(我的第一个答案是错误的)。为 keys[i]
分配一个新值不保留对象,因此您应该为键创建一个新数组:
NSDictionary *old = @{@"key1": @"foo", @"key2": @"bar"};
id __unsafe_unretained keys[2];
id newKeys[2];
id __unsafe_unretained vals[2];
[old getObjects:vals andKeys:keys];
for (NSUInteger i = 0; i < 2; i++) {
newKeys[i] = [keys[i] uppercaseString];
}
NSDictionary *new = [NSDictionary dictionaryWithObjects:vals forKeys:newKeys count:2];
或者,您可以枚举旧字典并创建新字典先后:
NSMutableDictionary *newDict = [NSMutableDictionary dictionary];
[old enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
key = [key uppercaseString];
newDict[key] = obj;
}];
(旧的错误答案已删除)
关于objective-c - 如何安全地将对象放入 __unsafe_unretained 数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25065261/
我是一名优秀的程序员,十分优秀!