0

NSMutableArray(>2500)に多くのオブジェクトがあり、それを保存するとアプリがクラッシュします (メモリ警告 x3 を受け取りました)。

    NSLog(@"start");
    NSInteger saveTemp = 0;
    NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&err];
    if ([data length] > 0 && err == nil)
    {
        MyClass* rcust;
        NSString *respStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSMutableArray* cust = [respStr JSONValue];
        for(NSDictionary *v in cust)
        {
            if([dataProvider getClassById:[[v valueForKey:@"Id"] integerValue] error:nil] == nil)
            {
                rcust = [dataProvider createClass];
                rcust.clsId = [v valueForKey:@"Id"];
            }
            else
            {
                rcust = [dataProvider getClassById:[[v valueForKey:@"Id"] integerValue] error:nil];
            }
            rcust.cstZip = [v valueForKey:@"Zip"] == [NSNull null]? @"": [v valueForKey:@"Zip"];

            saveTemp++;
            if(saveTemp > 1000)
            {
                NSLog(@"save");
               [dataProvider saveContext];
                saveTemp = 0;
            }
        }
        [dataProvider saveContext];
    }

ここでsaveContextメソッド

- (void)saveContext {
    NSError*err = nil;
    if(![[self managedObjectContext] save:&err])
    {
        NSLog(@"Unresolved error %@, %@", err, [err userInfo]);
    }
}

更新: メソッドにコードを追加しました。

2013-03-21 15:18:54.641  start
2013-03-21 15:19:31.843  save
2013-03-21 15:23:21.126  save

つまり、データの保存が遅くなり、しばらくするとアプリケーションがクラッシュします。

4

1 に答える 1

0

したがって、その NSURLRequest から 2500 を超える顧客が返されているようです。配列にデータを入力するまでにcust、そのデータのコピーが 4 つ作成されます (NSData、NSString、NSMutableArray、および NSManagedObjectContext 内)。

@autoreleasepool を使用して、NSData および NSString 変換をラップします。呼び出しが完了する-JSONValueと、それらの表現はもう必要ありません。

次に、処理ループも @autoreleasepool にラップします。これにより、中間結果 (見えないものも含む) を解放できます。

最後に、saveContext を実行するときに、管理対象オブジェクト コンテキストでも -reset を実行します。

あなたのための他の2つのメモ:

4 行目の NSError パラメータのチェックは正しくありません。NSError** パラメーターを持つメソッドの場合、操作が成功した場合、NSError の戻り値は未定義です。その後、ロジックをif (data.length > 0)続行する必要があります。それ以外の場合は、NSError を調べます。NSURLConnection のクラス リファレンスを参照してください。

また、あなたのgetClassByIdメソッドは Cocoa の命名基準に違反しているようです。メソッドが単語で始まる場合、getパラメータの参照によって結果を返す必要があります。https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282-BCIGIJJFを参照してください。

于 2013-03-23T01:58:23.000 に答える