0

次の方法を確認して、使用後に辞書キーの列挙子を解放する必要があるかどうかを教えてください。私は目的の c を初めて使用し、SDK メソッドから返された変数をいつ解放するかが常にわかりません。keyEnumerator メソッドは自動解放されたインスタンスを返すと思うので、使い終わったときに気にする必要はありません。右?

うーん..この方法で他に何か問題があるのでしょうか?;)

#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
4

1 に答える 1

1

メソッドを呼び出していないオブジェクトに対しても呼び出しを行っていない場合は、それら releaseのオブジェクトを呼び出してはなりません。Cocoaのメモリ管理プログラミング ガイドを参照してください。allocretain

また、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 Programming Language ReferenceのFast Enumerationセクションを読む必要があります。

また、友好的なアドバイスとして、本当に必要でない限り、NSDictionary を拡張したり、それにカテゴリを作成したりしないことをお勧めします。

于 2010-01-28T00:25:12.930 に答える