gpt4 book ai didi

ios - 为什么(复制,非原子的)NSMutableArray 属性创建 NSArrays?

转载 作者:IT王子 更新时间:2023-10-29 08:00:50 27 4
gpt4 key购买 nike

我在创建 TableView class 时犯了一个错误,在定义它时不小心将我的 @property 保留为 copy:

@property (copy, nonatomic) NSMutableArray *words; 

我“正确地”初始化了数组:(注意这是第三次尝试,所以请忽略我没有使用 mutableCopy 和其他更好的方法)

NSArray *fixedWords = @[@"Eeny", @"Meeny", @"Miny", @"Moe", @"Catch", @"A", @"Tiger", @"By", @"His", @"Toe"];
NSMutableArray *mutWords = [[NSMutableArray alloc] initWithArray:fixedWords];
self.words = mutWords;

但是,当我稍后对数组重新排序时,它在 removeObjectAtIndex 行崩溃了:

id object = [self.words objectAtIndex:fromIndexPath.row];
NSUInteger from = fromIndexPath.row;
NSUInteger to = toIndexPath.row;
[self.words removeObjectAtIndex:from];

带有错误信息

unrecognized selector sent to instance

经过大量挖掘才发现这是因为复制意味着分配 NSMutableArray 会导致创建标准(不可变)NSArray。谁能解释为什么这是正确的行为?

最佳答案

-copy,由可变 Cocoa 类实现,总是 returns their immutable counterparts .因此,当一个 NSMutableArray 被发送 -copy 时,它返回一个包含相同对象的 NSArray。

因为 words 有内存限定符 copy,这一行:

NSMutableArray *mutWords = [[NSMutableArray alloc] initWithArray:fixedWords];
self.words = mutWords;

展开为:

NSMutableArray *mutWords = [[NSMutableArray alloc] initWithArray:fixedWords];
self.words = [mutWords copy];

考虑到 NSMutableArray 是 NSArray 的子类,编译器不会提示,现在您手上有一颗滴答作响的定时炸弹,因为 NSArray 无法识别它的可变子类方法(因为它不能改变它的内容)。

关于ios - 为什么(复制,非原子的)NSMutableArray 属性创建 NSArrays?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14856681/

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