gpt4 book ai didi

ios - NSCopying 自定义对象数组

转载 作者:行者123 更新时间:2023-11-28 20:22:09 24 4
gpt4 key购买 nike

我有一个单例对象来管理我的所有列表。我们将其称为 ListStore。

ListStore 有一个可变数组,用于存储列表。

@interface ListStore : NSObject
@property (nonatomic, copy) NSMutableArray *lists; // an array of List objects
end

Lists 有一个可变数组,用于存储 Things。

@interface Wanderlist : NSObject <NSCoding, NSCopying>
@property (nonatomic, copy) NSMutableArray *things; // an array of Thing objects
@end

在任何时候,后台进程都可能通过 ListStore 并循环处理所有列表,而用户可能正在与列表进行交互。

为了防止“object was mutated while being enumerated”类型错误,我这样做:

// all of this is in a background thread
NSArray *newLists = [[ListStore sharedStore] lists] copy];

for (List *list in newLists) {
// yay, no more crashes, because I'm enumerating over a copied object, so the user
// can do whatever they want while I'm here

for(Thing *thing in list.things) {
// oh crap, my copy and the original object both reference the same list.things,
// which is why i'm seeing the 'mutation while enumerating" errors still
...
}
}

我最初认为,因为我将副本复制到 newLists 中,所以它的所有成员都会被正确复制。我现在明白情况并非如此:我仍然看到“对象在枚举时发生了突变”错误,但这次它发生在 list.things 上。

我可以在我的设置中使用 NSCopying 以便当我说:

[[ListStore sharedStore] copy];

它在 Lists 上调用 copyWithZone:,这样我就可以在 thingscopyWithZone: 了吗?

我试着像这样设置它,但是 copyWithZone: 没有被调用。

我知道我可以简单地说 NSArray *newList = [list.things copy] 但我想至少更好地理解 NSCopying。

最佳答案

就在提交这个问题之前,我点击了 SO 的相关问题列表中的一个问题,找到了我的解决方案。

认为发布我的解决方案没有坏处。

取而代之的是:

NSArray *newLists = [[ListStore sharedStore] lists] copy];

我必须做的:

NSArray *newLists = [[NSArray alloc] initWithArray:[[ListStore sharedStore] lists] copyItems:true];

来自 the NSArray docs :

- (id)initWithArray:(NSArray *)array copyItems:(BOOL)flag
flag:
If YES, each object in array receives a copyWithZone: message to create a copy of the object—objects must conform to the NSCopying protocol. In a managed memory environment, this is instead of the retain message the object would otherwise receive. The object copy is then added to the returned array.

一旦我使用了 initWithArray:copyItems:,它会自动将 copyWithZone 发送到我所有的 List 对象,然后我能够在 list.things 上手动执行 copyWithZone。

关于ios - NSCopying 自定义对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15488655/

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