0

いくつかの異なる種類の XML ファイルの解析を処理する必要があるアプリケーションを構築しています。手順を可能な限り標準化したいので、XML データの解析を処理するシングルトン クラスを作成しました。このクラスには、解析する XML データの種類を示す一意の識別子と、データ自体の 2 つのオプションが渡されます。クラス内には、解析を行い、結果を含む NSMutableArray オブジェクトを返す次の関数があります。

- (NSMutableArray*) initAPIDataParse:(NSData *)data APIRequestType:(int)requestType {

    // Init parser
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

    // Set delegate for parser
    if (requestType == kXMLParserTypeOne) {
        [parser setDelegate:[[[XMLParserOne alloc] init] autorelease]];
    } else if (requestType == kXMLParserTypeTwo) {
        [parser setDelegate:[[[XMLParserTwo alloc] init] autorelease]];
    } // etc.

    // let's parse the XML
    [parser parse];

    [parser release];

    return lastParsedDict; //lastParsedDict is the NSMutableArray object returned from the Parser delegate
}

上記のコードは魅力的に機能しますが、同じタイプの XML を複数回解析すると、次の行がリークします (これは理にかなっています)。

[parser setDelegate:[[[XMLParserOne alloc] init] autorelease]];

この問題を解決するために、デリゲートのインスタンスを使用してインスタンス変数を作成し、同じタイプの XML パーサーが再び要求されるたびにそれを解放するなど、いくつかのことを試みましたが、うまくいきませんでした。

ここで何か助けてもらえてうれしいです、どうもありがとう!

4

1 に答える 1

1

デリゲート オブジェクトは保持されません。したがって、それらに自動解放オブジェクトを使用すると、ほとんどの場合、クラッシュする可能性があります。

私はあなたのコードをリファクタリングしました:

- (NSMutableArray*) parseData: (NSData*) data withAPIRequestType: (int) requestType
{
    NSMutableArray* result = nil;

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    if (parser != nil)
    {
        switch (requestType) {
            case kXMLParserTypeOne:
                delegate = [XMLParserOne new];
                break;
            case kXMLParserTypeTwo:
                delegate = [XMLParserTwo new];
                break;              
        }

        if (delegate != nil)
        {
            [parser setDelegate: delegate];
            [parser parse];
            result = [delegate.result retain];

            [delegate release];
        }

        [parser release];
    }

    return [result autorelease];
}
于 2010-01-30T18:08:33.227 に答える