gpt4 book ai didi

iphone - 使用 NSMutableSet 时出错

转载 作者:行者123 更新时间:2023-12-01 17:13:45 28 4
gpt4 key购买 nike

我得到错误

* Terminating app due to uncaught exception 'NSGenericException', reason: '* Collection <__NSCFSet: 0x6b66390> was mutated while being enumerated.'



向我的类(class)添加新代表时。或者至少,这就是我认为问题所在。

这是我的代码:MyAppAPI.m
[...]
static NSMutableSet *_delegates = nil;

@implementation MyAppAPI

+ (void)initialize
{
if (self == [MyAppAPI class]) {
_delegates = [[NSMutableSet alloc] init];
}
}

+ (void)addDelegate:(id)delegate
{
[_delegates addObject:delegate];
}

+ (void)removeDelegate:(id)delegate
{
[_delegates removeObject:delegate];
}
[...]

@end

MyAppAPI 是一个单例,我可以在整个应用程序中使用它。只要我能(或应该能)做: [MyAppAPI addDelegate:self] .
这很好用,但仅在第一个 View 中。这个 View 有一个带有 PageViewController 的 UIScrollView,它在自身内部加载新的 View 。这些新 View 注册到 MyAppAPI 以监听消息,直到它们被卸载(在这种情况下,它们会执行 removeDelegate )。
但是,在我看来,它在我对 UIScrollView 的第二个 View 执行 addDelegate 后直接死亡。

我怎样才能改进代码,以免发生这种情况?

更新
我想进一步澄清一下。
发生的事情是 View Controller “StartPage”有一个带有页面 Controller 的 UIScrollView。它加载了几个其他 View (当前可见屏幕前 1 个)。
每个 View 都是一个实例 PageViewController,它使用上面显示的 addDelegate 函数将自己注册到名为 MyAppAPI 的全局单例中。
但是,据我了解,当 View Controller 2 注册自身时,此 View Controller 1 仍在从委托(delegate)中读取,因此上面显示了错误。

我希望我把这个场景说清楚了。我已经尝试了一些东西,但没有任何帮助。
即使在从代表那里阅读时,我也需要使用 addDelegate 向代表注册。我怎么做?

更新 2
这是应答器方法之一:
+ (void)didRecieveFeaturedItems:(NSArray*)items
{
for (id delegate in _delegates)
{
if ([delegate respondsToSelector:@selector(didRecieveFeaturedItems:)])
[delegate didRecieveFeaturedItems:items];
}
}

最佳答案

斯科特·亨特是对的。当您尝试在迭代时编辑列表时会引发此错误。

所以这里有一个你可能正在做的例子。

+ (void)iteratingToRemove:(NSArray*)items {   
for (id delegate in _delegates) {
if(delegate.removeMePlease) {
[MyAppAPI removeDelegate:delegate]; //error you are editing an NSSet while enumerating
}
}
}

以下是您应该如何正确处理此问题:
+ (void)iteratingToRemove:(NSArray*)items
{
NSMutableArray *delegatesToRemove = [[NSMutableArray alloc] init];
for (id delegate in _delegates) {
if(delegate.removeMePlease) {
[delegatesToRemove addObject:delegate];
}
}

for(id delegate in delegatesToRemove) {
[MyAppAPI removeDelegate:delegate]; //This works better
}

[delegatesToRemove release];
}

关于iphone - 使用 NSMutableSet 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7922386/

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