1

LeakInstrumentを使用してアプリをリークからクリーンアップしようとしています。xmlパーサー(TBXML)のリークが表示されます。

これが、解析時に作成するクラスです。

@interface GraphPoint : NSObject {
    NSString* x;
    NSString* y;
}


@property (nonatomic, copy) NSString* x;
@property (nonatomic, copy) NSString* y;

@end

@implementation GraphPoint

@synthesize x, y;

... some calculations

- (void) dealloc
{
    [x release];
    [y release];
    [super dealloc];
}

@end

パーサーで:

... //要素に従って見つかった場合:

        NSString    *str;
        GraphPoint  *aPoint = [[GraphPoint alloc] init];

        TBXMLElement *item = [TBXML childElementNamed:kX_Item parentElement:pntItem];
        str = [TBXML textForElement:item];  
        aPoint.x = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];     

        item = [TBXML childElementNamed:kY_Item parentElement:pntItem];
        str = [TBXML textForElement:item];  
        aPoint.y = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];


        [points addObject:aPoint];
        [aPoint release];

リークインスツルメントは、自動解放された文字列を提供するTBXMLのtextForElement関数でリークを示します。

+ (NSString*) textForElement:(TBXMLElement*)aXMLElement {
    if (nil == aXMLElement->text) return @"";
    return [NSString stringWithCString:&aXMLElement->text[0] encoding:NSUTF8StringEncoding];
}

私たちは時々数百または数千のポイントについて話しているので、これらのリークは何か巨大なものになります。自動リリースされた文字列がリークを生成する理由がわかりませんか?

何かご意見は?

ありがとう

4

1 に答える 1

0

投稿されたコードには保持/解放の問題はありません。の唯一の割り当てtextForElement:はNSStringstringWithCString:encoding:であり、これはリークすることはないと思います。

問題は他の場所にあり、与えられた情報では答えられません。Instrumentsの結果を正しく読んでいますか?静的分析はコードについて何と言っていますか?

TBXMLライブラリについてはわかりませんが、含まれnil == aXMLElement->textている行によって少し怪しげに見えます。これはエラーではありませんが、スタイルの問題です。objcオブジェクトに使用されてaXMLElement->textいる間はC文字列のようです。nil

于 2010-07-06T11:50:21.520 に答える