Re: remove elements during the iteration on NSMutableDictionary
Re: remove elements during the iteration on NSMutableDictionary
- Subject: Re: remove elements during the iteration on NSMutableDictionary
- From: Negm-Awad Amin <email@hidden>
- Date: Wed, 6 Aug 2008 19:14:30 +0200
Am Mi,06.08.2008 um 18:49 schrieb Andrew Merenbach:
On Aug 6, 2008, at 9:30 AM, Roland King wrote:
for (id theKey in aDictionary) {
id anObject = [[aDictionary objectForKey:theKey] retain];
[aDictionary removeObjectForKey:theKey];
// Question: will this removal break or corrupt the loop of
enumerating the
elements?
[anObject someMessage];
[anObject release];
}
Oops, I diid not see that, sorry.
Yup, that works. I prefer:
[id anObject = [[aDictionary objectForKey:theKey] retain]
autorelease];
That allows breaks inside the loop. (And you do not forget the -
release, as you did.)
Amin
or send it a message before you remove it from the dictionary.
for( id theKey in aDictionary ){
id anObject = [[ aDictionary objectForKey:theKey ];
[ anObject someMessage ];
[ aDictionary removeObjectForKey:theKey ];
}
of course as the original response pointed out, you can't really do
this anyway as the modification will cause an exception so you
don't really have the problem, you can't really remove the object
where you're removing it.
One question I had, the mutable guard which raises the exception,
that's only there because of the use of fast-enumeration, am I
right? Had you used an NSEnumerator I believe it's still not safe
to remove objects, but I don't think you get the exception, you
just need to know you mustn't do
it._______________________________________________
May I suggest the following?
-----
NSMutableArray *keysToRemove = [NSMutableArray array];
for (id theKey in aDictionary) {
[keysToRemove addObject:theKey];
}
[aDictionary removeObjectsForKeys:keysToRemove];
You can even use -[NSDictionary objectsForKeys:notFoundMarker:] to
send a single message to the dictionary's objects using -
makeObjectsPerformSelector:
Cheers,
Andrew
Hey, I didn't know that. Seems to be the best solution, because the
multi-remove message may optimize the operation.
Amin Negm-Awad
email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden