0

次のシナリオでメモリ リークが発生しました。30 秒ごとにデータを読み取り、SBJSONParser を使用してそれを辞書に変換し、通知を追加してから、データを使用してテーブルビューにバインドします。

// Read data and send notification
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSString *content = [[NSString alloc] initWithData:[data subDataWithRange:NSMakeRange(0, [data length] - 2)] encoding: NSUTF8StringEncoding];

    // Line where leaks appear
    NSMutableDictionary* dict = [[NSMutableDictionary alloc] initWithDictionary:[content JSONValue]];

    [content release];

    // Post notification
    [[NSNotificationCenter defaultCenter] postNotificationName:@"BindData" object:nil userInfo:dict];

     [dict release];
}

CustomViewController には、オブザーバーがあります。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bindData) name:@"BindData" object:nil];

および bindData メソッド:

-(void)bindData:(NSNotification*)notification
{
    NSAutoreleasePool* pool = [[NSAutoReleasePool alloc] init];

    NSMutableArray* customers = [notification.userInfo objectForKey:@"Customers"];
    for (NSDictionary* customer in customers)
    {
         Company* company = [[Company alloc] init];
         company.name = [customer objectForKey:@"CompanyName"];
         NSLog(@"Company name = %@", company.name);
         [company release];
    }

    [pool drain];
}

問題は、その辞書から company.name = something を設定すると、次の行でメモリ リークが発生することです。30秒ごとに読んでいるので、増え続けています。

私はあなたが与えることができる任意の助けに感謝します. ありがとう。

4

1 に答える 1

0

dictallocandを使用しているためinit(したがって、保持カウントを 1 増やします)、決して解放しないため、リークしています。通知が投稿された後は辞書は不要になるため、次のように次の行で安全に解放できます。

// Post notification
[[NSNotificationCenter defaultCenter] postNotificationName:@"BindData" object:nil userInfo:dict]
[dict release];

詳細については、メモリ管理プログラミング ガイドを参照してください。

于 2010-11-30T09:36:31.030 に答える