views:

151

answers:

1

Can anyone please review the following method and tell me if it is necessary to release the enumerator for the dictionary keys after using it? I'm new to objective c and not always sure, when to release variables returned from the SDK methods. I suppose the keyEnumerator method returns an autoreleased instance so I don't have to care about it when I'm finished with it. Right?

Hmm.. maybe anything else wrong in this method? ;)

#import "NSDictionaryURLEncoding.h"
#import <Foundation/NSURL.h>

@implementation NSDictionary(URLEncoding)

-(NSString *)urlEncoded
{
   NSEnumerator *keyEnum = [self keyEnumerator];
   NSString *currKey;
   NSString *currObject;
   NSMutableString *result = [NSMutableString stringWithCapacity: 64];

   while ((currKey = [keyEnum nextObject]) != nil)
   {
      if ([result length] > 0)
      {
         [result appendString: @"&"];
      }
      currObject = [[self objectForKey: currKey] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
      currKey = [currKey stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

      [result appendString: [NSString stringWithFormat:@"%@=%@", currKey, currObject]];
   }
   return result;
}

@end
+1  A: 

You must never release objects for which you did not call the alloc method if you also didn't retain them. See the Memory Management Programming Guide for Cocoa.

Also, if you're programming for the iPhone OS or if you are targetting Mac OS X 10.5 or later, I suggest you use the for(... in ...) language construct to enumerate through your dictionary. It's much faster than using enumerators.

for(NSString* currKey in self)
{
    NSString* currObject = [self objectForKey:currKey];
    // the rest of your loop code
}

You should read the Fast Enumeration section of the Objective-C Programming Language Reference.

I also suggest, as a friendly advice, that you don't extend NSDictionary or create a category on it unless you really, really need it.

zneak
Thank you.Yes, there are many specs I still have to read, I know. Unfortunately the day only has 24 hours. I'm just through the "Beginning iPhone 3 Development" book and the Stanford podcasts and now in the "learning by doing" phase.I moved the method to a class where it's needed. ;)Lessons learned today:- If you did not allocate or retain things, don't care about releasing them- Never extends SDK classes, when there is another solution
MacTouch