gpt4 book ai didi

objective-c - 如何安全地将对象放入 __unsafe_unretained 数组中?

转载 作者:搜寻专家 更新时间:2023-10-30 20:17:22 25 4
gpt4 key购买 nike

我正在尝试处理和更改 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com