1

IOS 5.1 シミュレーターで次のコードを実行しています。

Table* sparkFront =
  [NSEntityDescription insertNewObjectForEntityForName:@"Table"
                                inManagedObjectContext:_context];
NSLog(@"%@", sparkFront);
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Table"
                                          inManagedObjectContext:_context];
NSDictionary* dict = [entity propertiesByName];
for (NSObject* key in [dict allKeys])
{
  NSLog(@"%@", key);
}
sparkFront.columnValuesAddress = 0x606;

このコードは、最終行の EXC_BAD_ACCESS でクラッシュします。Table オブジェクトは、次のように実装された Core Data オブジェクトです。

@interface Table : NSManagedObject
@property (nonatomic) int32_t columnValuesAddress;
@end

Core Data がスカラー型をネイティブに実行しないことは知っていますが、これは IOS 5+ のみのアプリであり、un/boxing が自動的に行われるという印象を受けました。クラッシュ前の上記のコードの出力は、コンテキストとエンティティが良好であることを示しています。

2012-07-20 22:17:52.714 otest[95147:7b03] <NSManagedObject: 0x9c87b20> (entity: Table; id: 0x9c86a80 <x-coredata:///Table/t2C0D90D5-E381-4BD0-B65D-8FC83C6D50DB2> ; data: {
columnValuesAddress = 0;
})
2012-07-20 22:17:52.716 otest[95147:7b03] columnValuesAddress

クラッシュ後、問題レポートには次のように表示されます。

Application Specific Information:
objc_msgSend() selector name: isNSNumber__
Simulator libSystem was initialized out of order.


Thread 0 Crashed:
0   libobjc.A.dylib                 0x00635098 objc_msgSend + 12
1   CoreData                        0x05c2e833 _PFManagedObject_coerceValueForKeyWithDescription + 483
2   CoreData                        0x05bfe3d1 _sharedIMPL_setvfk_core + 209
3   CoreData                        0x05c16687 _svfk_0 + 39
4   ECMCalTests                     0x0187f8f1 -[ECMCalTests testInsertRecords] + 849 (ECMCalTests.m:73)
5   CoreFoundation                  0x003f74ed __invoking___ + 29
6   CoreFoundation                  0x003f7407 -[NSInvocation invoke] + 167
7   SenTestingKit                   0x201039c4 -[SenTestCase invokeTest] + 184
8   SenTestingKit                   0x20103868 -[SenTestCase performTest:] + 183
9   SenTestingKit                   0x201034a9 -[SenTest run] + 82
10  SenTestingKit                   0x20106db2 -[SenTestSuite performTest:] + 106
11  SenTestingKit                   0x201034a9 -[SenTest run] + 82
12  SenTestingKit                   0x20106db2 -[SenTestSuite performTest:] + 106
13  SenTestingKit                   0x201034a9 -[SenTest run] + 82
14  SenTestingKit                   0x20105e97 +[SenTestProbe runTests:] + 174
15  CoreFoundation                  0x00492d51 +[NSObject performSelector:withObject:] + 65
16  otest                           0x0000231c 0x1000 + 4892
17  otest                           0x000025be 0x1000 + 5566
18  otest                           0x00002203 0x1000 + 4611
19  otest                           0x00001f8d 0x1000 + 3981
20  otest                           0x00001f31 0x1000 + 3889

私は何を間違っていますか?

更新: コア データ チュートリアルに従って、プロパティのセッター/ゲッターを実装しました。それはまだクラッシュします。セッターのブレークポイントにヒットすることはないため、セッターを呼び出す前にクラッシュします。Apple のコードにバグがありますか?

@interface Table : NSManagedObject
{
  int32_t columnValuesAddress;
}
@property (nonatomic) int32_t columnValuesAddress;
@end

@implementation Table

- (int32_t)columnValuesAddress
{
  [self willAccessValueForKey:@"columnValuesAddress"];
  int32_t address = columnValuesAddress;
  [self didAccessValueForKey:@"columnValuesAddress"];
  return address;
}

- (void)setColumnValuesAddress:(int32_t)address
{
  [self willChangeValueForKey:@"columnValuesAddress"];
  columnValuesAddress = address;
  [self didChangeValueForKey:@"columnValuesAddress"];
}

- (void)setNilValueForKey:(NSString *)key
{
  if ([key isEqualToString:@"columnValuesAddress"])
  {
    self.columnValuesAddress = 0;
  }
  else
  {
    [super setNilValueForKey:key];
  }
}

@end
4

2 に答える 2

1

エンティティ エディタで、クラスを設定する必要があります。これは、ファイル テンプレートを使用してコア データ クラス ファイルを作成するときに設定されます。テンプレートなしでクラス ファイルを作成したため、クラスが設定されていなかったため、これらのエラーが発生していました。クラスが表示され、それがassign.

于 2014-07-20T03:57:34.397 に答える
0

まったく新しいプロジェクトを作成し、モデルを最初から作成し直し、古いプロジェクトからテスト コードをコピーしました。この新しいプロジェクトは正常に動作します。古いプロジェクトが機能しない理由はわかりませんが、少なくとも解決策はあります。

于 2012-07-21T19:56:52.040 に答える