2010-01-28 4 views
0

Может кто-нибудь, пожалуйста, рассмотрите следующий метод и скажите мне, нужно ли освобождать перечислитель для ключей словаря после его использования? Я новичок в объекте c и не всегда уверен, когда выпустить переменные, возвращаемые с помощью методов SDK. Я полагаю, что метод keyEnumerator возвращает экземпляр с автореализацией, поэтому мне не нужно заботиться об этом, когда я закончил с ним. Правильно?NSDictionary: URL-кодирование

Хм .. может быть, что-то еще не так в этом методе? ;)

#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

Вы должны никогдаrelease объекты, для которых вы не вызываете метод alloc, если вы не retain их. См. Memory Management Programming Guide for Cocoa.

Кроме того, если вы программируете для ОС iPhone или используете Mac OS X 10.5 или новее, я предлагаю вам использовать конструкцию языка for(... in ...) для перечисления через словарь. Это намного быстрее, чем использование счетчиков.

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

Вы должны прочитать Fast Enumeration раздел Objective-C по языку программирования.

Я также предлагаю в качестве дружеского совета, что вы не распространяете NSDictionary или создаете на нем категорию, если вы действительно не нуждаетесь в ней.

+0

спасибо. Да, есть много спецификаций, которые мне все еще нужно читать, я знаю. К сожалению, в этот день есть только 24 часа. Я просто через книгу «Начало разработки iPhone 3» и подкасты Стэнфорда, а теперь и на этапе «обучения». Я переместил метод в класс, где это необходимо. ;) Уроки, полученные сегодня: - Если вы не выделили или не сохранили вещи, не волнуйтесь о их освобождении - Никогда не расширяет классы SDK, если есть другое решение – MacTouch

Смежные вопросы