Re: Fast Enumeration and remove elements

2015-01-18 Thread Quincey Morris
On Jan 18, 2015, at 12:45 , Trygve Inda cocoa...@xericdesign.com wrote:
 
 NSMutableDictionary* collection;  // keys are myID, values are MyObject
 
 for (MyObject* object in [[self collection] allValues])
 {
[collection removeObjectForKey:[object myID]];
 }

What Ken said, plus …

— If the collection of values is (as a matter of implementation) mutable, then 
I certainly wouldn’t want to rely on it not changing during the enumeration. If 
it is (as a matter of implementation) immutable, then it’s cost-free to copy. 
So the correct strategy is to copy it.

— It makes me uncomfortable to see you iterating through values, not keys. 
There is no API contract regarding uniqueness of the value objects, in the case 
that different keys refer to the same value object. Furthermore, your loop is 
logically incorrect in that case.

I know that might not matter here. Apparently, in the code fragment you showed, 
1 unique key == 1 unique object. But even if that’s so it seems more correct to 
iterate over “allKeys” instead of “allObjects”.

Also, every time I do something like this, I wonder if it’s semantically 
preferable to use a block enumeration, which for a dictionary would have to be 
‘keysOfEntriesPassingTest:’, followed by ‘removeObjectsForKeys:’. [I’m assuming 
your actual intent is to remove only some of the objects, because otherwise 
you’d use ‘removeAllObjects’ instead of a loop.]

I believe we found out, when the block enumeration API was introduced, that 
these don’t currently do anything particularly optimized, it seems to me that 
we can always hope that there will be such an optimization one day, so that the 
keysOf/remove pattern could be much more efficient for large dictionaries.

___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Fast Enumeration and remove elements

2015-01-18 Thread Trygve Inda
Apple says:

 It is not safe to remove, replace, or add to a mutable collection’s elements
 while enumerating through it. If you need to modify a collection during
 enumeration, you can either make a copy of the collection and enumerate using
 the copy or collect the information you require during the enumeration and
 apply the changes afterwards. The second pattern is illustrated in Listing 4.

So is this safe...

NSMutableDictionary* collection;  // keys are myID, values are MyObject

for (MyObject* object in [[self collection] allValues])
{
[collection removeObjectForKey:[object myID]];
}

It would seem that this is really enumberating the allValues array which
assuming it is only called once, represents the objects that exist at the
beginning of the for loop and removing them fro the collection dictionary is
safe.

Right?

Trygve




___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Re: Fast Enumeration and remove elements

2015-01-18 Thread Ken Thomases
On Jan 18, 2015, at 2:45 PM, Trygve Inda cocoa...@xericdesign.com wrote:

 So is this safe...
 
 NSMutableDictionary* collection;  // keys are myID, values are MyObject
 
 for (MyObject* object in [[self collection] allValues])
 {
[collection removeObjectForKey:[object myID]];
 }
 
 It would seem that this is really enumberating the allValues array which
 assuming it is only called once, represents the objects that exist at the
 beginning of the for loop and removing them fro the collection dictionary is
 safe.

It is probably safe.  It is very improbable that the -allValues method will 
return a reference to an internal mutable array used by NSMutableDictionary and 
therefore modified if you mutate it.  It is very improbable that 
NSMutableDictionary uses any such mutable array internally.

The fact that the modern declaration of allValue is as a declared property with 
the copy attribute is also a suggestion that it would be safe.

However, none of this is a guarantee that it's safe.  If you want to be 
certain, you can use [[self.collection.allValues copy] autorelease] (omit the 
autorelease under ARC).

Regards,
Ken


___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com