0

DBに最大60000個の値があります。私はそれらすべてを保持しなければなりません。しかし、値を挿入している間、exc_bad_accessを取得します。これが私のコードです:

if (context == nil)
{
    context = [(radioAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    NSLog(@"After managedObjectContext: %@",  context);
}

[self performSelectorOnMainThread:@selector(deleteAllFromDB) withObject:nil waitUntilDone:YES];

// here is JSON parsing
int i=0;

@synchronized(self)
{
    NSLog(@"Start");
    NSEntityDescription *entity = [[NSEntityDescription entityForName:@"Station" inManagedObjectContext:context] autorelease];

    for (NSString*string in stations)
    {
        if (![string isEqualToString:@""])
        {
            Station*station = [[[Station alloc] initWithEntity:entity insertIntoManagedObjectContext:nil] retain];

            NSError *err = nil;
            id parsedData = [NSJSONSerialization JSONObjectWithData:[string dataUsingEncoding:NSUTF8StringEncoding]
                                                            options:NSJSONReadingMutableContainers error:&err];
            if (err) {
                NSLog(@"error is %@", [err localizedDescription]);
            }

            [station setName:[parsedData objectForKey:@"nm"]];

            [station setBit: [parsedData objectForKey:@"btr"]];
            [station setEnabled: [NSNumber numberWithInt:1]];

            //encoding id of the station

            scanner = [NSScanner scannerWithString:[parsedData objectForKey:@"id"]];

            [scanner scanHexInt:&tempInt];

            NSNumber *numb = [[NSNumber alloc]initWithInt:i];
            [station setNumber: [NSNumber numberWithInt:[numb intValue]]];

            //encoding country ID

            numb = [NSNumber numberWithInt:i];
            [station setCountryID: [NSNumber numberWithInt:[numb intValue]]];

            //encoding genre ID
            numb = [NSNumber numberWithInt:i];
            [station setGenerID:[NSNumber numberWithInt:[numb intValue]]];

            [station setOrder:[NSNumber numberWithInt:i]];

            [context insertObject:station];

            float k = [stations count];
            k = (i + 1)/k;

            [self performSelectorOnMainThread:@selector(increaseProgress:) withObject:[NSNumber numberWithFloat:k] waitUntilDone:YES];

            i++;

            [scanner release];
            [numb release];
            [station release];
            [parsedData release];
        }
    }

    [context save:nil];
    [entity release];

    NSLog(@"Stop"); 

    NSEntityDescription *entityGen = [NSEntityDescription entityForName:@"Genre" inManagedObjectContext:context];

    NSURL* urlForGenre = [NSURL URLWithString:@"xxx.xxx"];
    NSData *genres = [[NSData alloc] initWithContentsOfURL:urlForGenre];

    NSError *err = nil;
    NSArray *parsedGenres = [NSJSONSerialization JSONObjectWithData:genres options:NSJSONReadingMutableContainers error:&err];
    if (err)
    {
        NSLog(@"error is %@", [err localizedDescription]);
    }


    for (int i =0; i<parsedGenres.count; i++)
    {
        Genre*gen = [[Genre alloc] initWithEntity:entityGen insertIntoManagedObjectContext:nil];

        gen.name = [[parsedGenres objectAtIndex:i] objectForKey:@"nm"];

        int tempInt;
        NSScanner *scanner= [[NSScanner alloc] init];
        scanner = [NSScanner scannerWithString:[[parsedGenres objectAtIndex:i] objectForKey:@"id"]];

        [scanner scanInt:&tempInt];

        NSNumber *numb = [[NSNumber alloc] init];
        numb = [NSNumber numberWithInt:tempInt];

        gen.number = [NSNumber numberWithInt:[numb integerValue]];

        float k = [parsedGenres count];
        k = (i + 1)/k;

        [self performSelectorOnMainThread:@selector(increaseProgress:) withObject:[NSNumber numberWithFloat:k] waitUntilDone:YES];
        [context insertObject:gen];

        [gen release];
    }

    [entityGen release];
    [context save:nil];

    NSEntityDescription *entityCon = [NSEntityDescription entityForName:@"Country" inManagedObjectContext:context];

    NSURL* urlForCoun = [NSURL URLWithString:@"yyy.yyy"];
    NSData *countr = [[NSData alloc] initWithContentsOfURL:urlForCoun];

    err = nil;
    NSArray *parsedCountr = [NSJSONSerialization JSONObjectWithData:countr options:NSJSONReadingMutableContainers error:&err];
    if (err)
    {
        NSLog(@"error is %@", [err localizedDescription]);
    }

    NSMutableArray* temp = [[NSMutableArray alloc] init];

    for (int i =0; i<parsedCountr.count; i++)
    {
        Country*countr = [countr initWithEntity:entityCon insertIntoManagedObjectContext:nil];

        countr.name = [[parsedCountr objectAtIndex:i] objectForKey:@"nm"];

        int tempInt;
        NSScanner *scanner= [[NSScanner alloc] init];
        scanner = [NSScanner scannerWithString:[[parsedCountr objectAtIndex:i] objectForKey:@"id"]];

        [scanner scanInt:&tempInt];

        NSNumber *numb = [[NSNumber alloc] init];
        numb = [NSNumber numberWithInt:tempInt];

        countr.number = [NSNumber numberWithInt:[numb integerValue]];

        [temp addObject:countr];

        float k = [parsedCountr count];
        k = (i + 1)/k;

        [self performSelectorOnMainThread:@selector(increaseProgress:) withObject:[NSNumber numberWithFloat:k] waitUntilDone:YES];

        [context insertObject:countr];

        [countr release];
    }

    [context save:nil];

私のアプリがクラッシュしない場合は、はい、起動するたびにクラッシュするわけではありません。クラッシュします:

Country*countr = [countr initWithEntity:entityCon insertIntoManagedObjectContext:nil];

助けてください!そして、私のひどい英語でごめんなさい。

アップデート:

オン:Country * countr = [countr initWithEntity:entityCon insertIntoManagedObjectContext:nil];

スレッド7:EXC_BAD_ACCESS(コード= 1、アドレス= 0x3f800008)

その他のエラーもexc_bad_accessです。しかし、code=2および他のスレッドで。

アップデート2:

デバッグのスキームでゾンビモードを有効にしました。何も起こらなかった。

アップデート3:

記憶に問題があると思います。

GuardMalloc:4128バイトのVM割り当てに失敗しました

GuardMalloc:明示的にデバッガーにトラップします!!!

4

2 に答える 2

0

パラメータとしてnilメソッドに渡すことはできません。これを変更してみてください:managedObjectContextinitWithEntity:insertIntoManagedObjectContext:

Country*countr = [countr initWithEntity:entityCon insertIntoManagedObjectContext:nil];

これに

// pass managed object context parameter
Country*countr = [countr initWithEntity:entityCon insertIntoManagedObjectContext:context];
于 2013-02-07T17:12:54.460 に答える
0

ドキュメントと私の経験に基づいて、nil を managedObjectContext として渡すことができます。

EXC_BAD_ACCESS も取得していましたが、マネージド オブジェクト モデルを保持していなかったことが原因でした (エンティティの説明を取得するためのモデルを作成しただけで、それがリリースされました)。

特に、これは私がしていたことです:

テスト クラスの setUp メソッドで:

- (void)setUp
{
    [super setUp];

    NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    NSURL *modelURL = [bundle URLForResource:@"TestDatamodel" withExtension:@"momd"];
    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    STAssertNotNil(model, nil);

    _entity = [[model entitiesByName] objectForKey:NSStringFromClass([MyEntity class])];
    STAssertNotNil(_entity, nil);
    // ...
}

次に、テスト メソッドで、次のようなコンテキストのないマネージド オブジェクトを作成していました。

NSManagedObject *object = [[NSManagedObject alloc] initWithEntity:_entity insertIntoManagedObjectContext:nil];

ここで EXC_BAD_ACCESS を取得していました。

解決策は、ivar をテスト クラスに追加して、マネージド オブジェクト モデルへの参照を保持することでした。

于 2013-10-23T15:04:41.270 に答える