We have extended NSMenu so we could add some other methods. Many of the methods 
iterate over the itemArray like so:

        for(NSMenuItem* item in [self itemArray])

Instruments shows that we're leaking NSArrays created when itemArray returns. I 
assume whoever wrote these methods was assuming that itemArray would simply 
return the internal NSArray and not make a copy. I guess I would make the same 
assumption since it's not a copy* method.

So my question is, what's the best way to write extension methods on an 
existing Cocoa class like this? One way would be to assign the itemArray result 
to a local variable and release it when done (ARC is not turned on in this 
project yet):

        NSArray*                items = [self itemArray];
        
        for(NSMenuItem* item in items)
                blah;
        
        [items release];

Another would be to simply use the instance variable instead of the accessor 
method:

        for(NSMenuItem* item in self->_itemArray)

I don't particularly like this one since it's using a private instance var in a 
Cocoa-owned class, even though the code using it is technically in the same 
class. Or perhaps Apple might change this in the future, so it would break this 
code.

One other thing to consider is this: Will the itemArray ever be reallocated 
while we're in the middle of one of these loops? I would guess not, but one 
never knows how Apple implements this stuff.

Thoughts?

--
Steve Mills
office: 952-818-3871
home: 952-401-6255
cell: 612-803-6157



_______________________________________________

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

Reply via email to