XMPPMulticastDelegate: Iterate over a copy of the delegates array
This commit is contained in:
parent
4ec96e63a1
commit
2d96126a44
2 changed files with 11 additions and 27 deletions
|
@ -30,7 +30,6 @@
|
||||||
@interface XMPPMulticastDelegate: OFObject
|
@interface XMPPMulticastDelegate: OFObject
|
||||||
{
|
{
|
||||||
OFDataArray *_delegates;
|
OFDataArray *_delegates;
|
||||||
size_t _handlerIndex;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#import <ObjFW/ObjFW.h>
|
||||||
#import <ObjFW/OFDataArray.h>
|
#import <ObjFW/OFDataArray.h>
|
||||||
|
|
||||||
#import "XMPPMulticastDelegate.h"
|
#import "XMPPMulticastDelegate.h"
|
||||||
|
@ -65,10 +66,6 @@
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
[_delegates removeItemAtIndex: i];
|
[_delegates removeItemAtIndex: i];
|
||||||
|
|
||||||
if (i <= _handlerIndex)
|
|
||||||
_handlerIndex--;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,12 +73,13 @@
|
||||||
- (BOOL)broadcastSelector: (SEL)selector
|
- (BOOL)broadcastSelector: (SEL)selector
|
||||||
withObject: (id)object
|
withObject: (id)object
|
||||||
{
|
{
|
||||||
size_t count = [_delegates count];
|
OFDataArray *currentDelegates = [_delegates copy];
|
||||||
id *items = [_delegates items];
|
id *items = [currentDelegates items];
|
||||||
|
size_t i, count = [currentDelegates count];
|
||||||
BOOL handled = NO;
|
BOOL handled = NO;
|
||||||
|
|
||||||
for (_handlerIndex = 0; _handlerIndex < count; _handlerIndex++) {
|
for (i = 0; i < count; i++) {
|
||||||
id responder = items[_handlerIndex];
|
id responder = items[i];
|
||||||
|
|
||||||
if (![responder respondsToSelector: selector])
|
if (![responder respondsToSelector: selector])
|
||||||
continue;
|
continue;
|
||||||
|
@ -90,13 +88,6 @@
|
||||||
[responder methodForSelector: selector];
|
[responder methodForSelector: selector];
|
||||||
|
|
||||||
handled |= imp(responder, selector, object);
|
handled |= imp(responder, selector, object);
|
||||||
|
|
||||||
/*
|
|
||||||
* Update count and items, since the handler might have changed
|
|
||||||
* them.
|
|
||||||
*/
|
|
||||||
count = [_delegates count];
|
|
||||||
items = [_delegates items];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return handled;
|
return handled;
|
||||||
|
@ -106,12 +97,13 @@
|
||||||
withObject: (id)object1
|
withObject: (id)object1
|
||||||
withObject: (id)object2
|
withObject: (id)object2
|
||||||
{
|
{
|
||||||
size_t count = [_delegates count];
|
OFDataArray *currentDelegates = [_delegates copy];
|
||||||
id *items = [_delegates items];
|
id *items = [currentDelegates items];
|
||||||
|
size_t i, count = [currentDelegates count];
|
||||||
BOOL handled = NO;
|
BOOL handled = NO;
|
||||||
|
|
||||||
for (_handlerIndex = 0; _handlerIndex < count; _handlerIndex++) {
|
for (i = 0; i < count; i++) {
|
||||||
id responder = items[_handlerIndex];
|
id responder = items[i];
|
||||||
|
|
||||||
if (![responder respondsToSelector: selector])
|
if (![responder respondsToSelector: selector])
|
||||||
continue;
|
continue;
|
||||||
|
@ -120,13 +112,6 @@
|
||||||
[responder methodForSelector: selector];
|
[responder methodForSelector: selector];
|
||||||
|
|
||||||
handled |= imp(responder, selector, object1, object2);
|
handled |= imp(responder, selector, object1, object2);
|
||||||
|
|
||||||
/*
|
|
||||||
* Update count and items, since the handler might have changed
|
|
||||||
* them.
|
|
||||||
*/
|
|
||||||
count = [_delegates count];
|
|
||||||
items = [_delegates items];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return handled;
|
return handled;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue