0

2 つのタブのアプリケーションがあります。最初のものでは、"Sample" および "SampleList" エンティティのオブジェクトを作成しています。各 sampleList には、ID とサンプルのセットが含まれています。各サンプルには、日付と温度のプロパティが含まれています。

2 番目のタブでは、データを tableView に表示しています。私は実装しました

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

メソッドを使用して SampleList を削除します。私xcdatamodelの場合、SampleList と Sample の関係の削除規則は ですCascade

私の問題は、作成したばかりの SampleList を削除しようとすると、アプリがクラッシュし、EXC_BAD_ACCESSシグナルを受信することです。再起動すると、「古い」sampleList を問題なく削除できます。

以前、次の問題がありました: アプリを起動してから作成した sampleLists もクラッシュして表示できませんでした。信号も受信しましたEXC_BAD_ACCESS。実際、このセットのサンプルが最後に作成された日付は だったようですnil。サンプルの日付を設定するために使用している NSDate をリリースしない場合、この問題はもうありません...

誰かが私のトラブルの原因を見つけるのを手伝ってくれたら、それは素晴らしいことです!!

新しいインスタンスを作成するために使用している方法は次のとおりです。

SampleList *newSampleList = (SampleList *)[NSEntityDescription insertNewObjectForEntityForName:@"SampleList" inManagedObjectContext:managedObjectContext];
[newSampleList setPatchID:patchID];
NSMutableSet *newSampleSet = [[NSMutableSet alloc] init];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

for (int i = 0; i < [byteArray count]; i=i+4, sampleCount++) {
  NSDateComponents *comps = [[NSDateComponents alloc] init];
  [comps setYear:year];
  [comps setMonth:month];
  [comps setDay:day];
  [comps setHour:hours];
  [comps setMinute:minutes];
  NSDate *sampleDate = [gregorian dateFromComponents:comps];

  Sample *newSample = (Sample *)[NSEntityDescription insertNewObjectForEntityForName:@"Sample" inManagedObjectContext:managedObjectContext];  

  [newSample setSampleDate:sampleDate];
  [newSample setSampleTemperature:[NSNumber numberWithInt:temperature]];

  [newSampleSet addObject:newSample];
  [comps release];
  //[sampleDate release];
 }

 [newSampleList setSampleSet:newSampleSet];
 // [newSampleSet release];

 NSError *error;
 if (![managedObjectContext save:&error]) {
  NSLog(@"Could not Save the context !!");
 }

 [gregorian release];

編集: 間違いを見つけました。次のように、各 sampleDate の比較を行っていました。

NSDate *maxDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:0];
(...)
for (int i = 0; i < [byteArray count]; i=i+4, sampleCount++) {
    (...)
    if ([maxDate compare:sampleDate] == NSOrdredAscending){
        max = sampleDate;
    }

私がすべきだった場所:

if ([maxDate compare:sampleDate] == NSOrdredAscending){
    [maxDate release];
    maxDate = [sampleDate retain];
}
4

2 に答える 2

1

NSEntityDescriptionのドキュメントによると、

+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context

自動解放されたオブジェクトを返します。したがって、次の後にリリースする必要はありません。

[newSampleList setSampleSet:newSampleSet];

newSampleList は最終的に自動解放されるため、アプリの再起動時に EXC_BAD_ACCESS が発生することがあります。

Apple のメモリ管理ドキュメントでは、オブジェクトを自分で解放する必要がある場合と、オブジェクトが自動解放される場合のベスト プラクティスを紹介しています。

于 2010-06-01T09:45:14.537 に答える
0

より有益な Core Data エラー レポートを取得するには、次のような方法を使用するのが好きです。

- (void) detailedStoreError:(NSError *)error {
    NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
    NSArray *_detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
    if (_detailedErrors != nil && [_detailedErrors count] > 0) {
        for (NSError *_detailedError in _detailedErrors) {
            NSLog(@" DetailedError: %@", [_detailedError userInfo]);
        }
    }
    else {
        NSLog(@" %@", [error userInfo]);
    }
}

次のように使用できます。

NSError *error;
if (![managedObjectContext save:&error]) {
    [self detailedStoreError:error];
}

より有益なエラー レポートは、トラブルシューティングに役立つ場合があります。

于 2010-06-01T07:57:34.760 に答える