2010-01-28 6 views
0

다음 방법을 검토하고 사용 후 사전 키의 열거자를 해제해야하는지 알려주십시오. 나는 SDK 메소드에서 반환 된 변수를 언제 릴리스해야하는지 항상 객관적이고 새로운 것은 아닙니다. keyEnumerator 메소드가 autoreleased 인스턴스를 리턴한다고 가정하고, 필자가 그 작업을 마쳤을 때 신경 쓸 필요가 없다. 권리?NSDictionary : URL 인코딩

음 ... 아마도이 방법에는 다른 것이 있을까요? 당신은 또한하지 retain을 한 경우)

#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 메소드를 호출하지 않았다해야합니다. Memory Management Programming Guide for Cocoa을 참조하십시오.

또한 iPhone OS 용으로 프로그래밍하거나 Mac OS X 10.5 이상을 타겟팅하는 경우 사전을 통해 열거하기 위해 for(... in ...) 언어 구문을 사용하는 것이 좋습니다. 열거자를 사용하는 것보다 훨씬 빠릅니다.

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

Objective-C 프로그래밍 언어 참조의 Fast Enumeration 섹션을 읽어야합니다.

또한 내가 정말로 필요로하지 않는 한 친숙한 조언으로 NSDictionary를 확장하거나 카테고리를 만들지 말 것을 제안합니다.

+0

감사합니다. 예, 아직 읽어야 할 많은 사양이 있습니다. 알아요. 불행히도 하루에만 24 시간이 있습니다. 저는 "Beginning iPhone 3 Development"서적과 스탠포드 포드 캐스트를 통해 "지금부터 배우기"단계에 있습니다. 메소드가 필요한 곳으로 옮겨졌습니다. ;) 오늘 배운 교훈 : - 물건을 할당하거나 보관하지 않은 경우에는 해제하지 마십시오. - 다른 해결책이있을 경우 SDK 클래스를 확장하지 마십시오. – MacTouch