我得到错误
* 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“* Collection <__NSCFSet: 0x6b66390> 在枚举时发生了变异。”
向我的班级添加新代表时。或者至少,这就是我认为问题所在。
这是我的代码: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]
。
这很好用,但仅在第一个视图中。这个视图有一个带有 PageViewController 的 UIScrollView,它在自身内部加载新的视图。这些新视图注册到 MyAppAPI 以侦听消息,直到它们被卸载(在这种情况下它们会执行 a removeDelegate
)。但是,在我看来,它在我对 UIScrollView 中的第二个视图执行 addDelegate 后直接死亡。
我怎样才能改进代码,以免发生这种情况?
更新
我想进一步澄清一下。发生的情况是视图控制器“StartPage”有一个带有页面控制器的 UIScrollView。它加载了几个其他视图(当前可见屏幕前 1 个)。每个视图都是一个实例 PageViewController,它使用上面显示的 addDelegate 函数将自己注册到名为 MyAppAPI 的全局单例中。但是,据我了解,当 viewcontroller 2 注册自身时,此 viewcontroller 1 仍在从委托中读取,因此上面显示了错误。
我希望我把这个场景说清楚了。我已经尝试了一些东西,但没有任何帮助。即使在从代表那里阅读时,我也需要使用 addDelegate 向代表注册。我怎么做?
更新 2 这是应答器方法之一:
+ (void)didRecieveFeaturedItems:(NSArray*)items
{
for (id delegate in _delegates)
{
if ([delegate respondsToSelector:@selector(didRecieveFeaturedItems:)])
[delegate didRecieveFeaturedItems:items];
}
}