4

int64_t プロパティを持つ 2 つのコア データ モデルがあります。整数フィールドにゼロ以外の値を割り当てようとすると、そのうちの 1 つが正常に動作し、もう 1 つが EXC_BAD_ACCESS をスローします。NSManagedObject 子クラスを再作成するという回答を読みましたが、成功しませんでした。壊れたクラスは次のようになります。

@interface NoteObject : NSManagedObject

@property (nonatomic) int64_t remoteID;
@property (nonatomic) int64_t remoteArticleID;

@property (strong, nonatomic) ArticleObject *article;

@property (strong, nonatomic) NSString *status;
@property (strong, nonatomic) NSString *token;

@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) NSString *noteContent;

@property (strong, nonatomic) NSDate *pubDate;
@property (strong, nonatomic) NSDate *modDate;

@end

@implementation NoteObject

@dynamic remoteID;
@dynamic remoteArticleID;

@dynamic article;

@dynamic status;
@dynamic token;

@dynamic title;
@dynamic noteContent;

@dynamic pubDate;
@dynamic modDate;

@end

問題のある行は次のブロックにあります。

_noteObject = [NSEntityDescription insertNewObjectForEntityForName:@"Note" inManagedObjectContext:self.managedObjectContext];

_noteObject.remoteArticleID = 0; // this works
_noteObject.remoteArticleID = 1; // this crashes

本当に困惑したのは、別のモデルに同じタイプの同じフィールドがあり、問題なくゼロ以外の値を受け入れることです。

bookmarkObject = [NSEntityDescription insertNewObjectForEntityForName:@"Bookmark" inManagedObjectContext:self.managedObjectContext];

bookmarkObject.remoteArticleID = 0; // this works
bookmarkObject.remoteArticleID = 1; // this works, too

.xcdatamodeld ファイルにこれを引き起こしている可能性のあるものはありますか?

編集

私のデータモデルは次のようになります。

注オブジェクト データ モデル BookmarkObject データ モデル

4

3 に答える 3

5

私はまったく同じ問題を抱えていました。

NSManagedObject のプロパティを手動で編集すると、xcode (またはおそらくコンパイラ、またはおそらくそれらの間の 2 つ) が時々混乱するようです - 最終的に整数をポインタとして扱い、メモリに直接アクセスしようとするため、EXC_BAD_ACCESS.

とにかく、この質問が説明しているように: SO Question、解決策は、古いクラスを削除し (明らかにカスタム コードをコピーして、後でもう一度貼り付けることができるようにする)、xcode を取得して再生成することです (データ内のエンティティを選択します)。モデルを選択し、「エディター/NSManagedObject サブクラスの作成...」を選択します)。表示されるダイアログで、「プリミティブ データ型にスカラー プロパティを使用する」がチェックされていることを確認します。

結果のクラスを手動で編集して、一部の非スカラー プロパティをオブジェクトに戻す必要がある場合があります (NSDate 以外のものに変換された日付オブジェクトがありました。正確には何を忘れましたが、NSDate への手動で行われた編集を受け入れました)。

それは私のために働いた。それがうまくいくことを願っています。

アリ

于 2013-07-11T19:18:14.097 に答える
2

他の誰かがこの問題を抱えている場合に備えて、一方のエンティティが機能し、もう一方のエンティティが機能しない理由について、満足のいく答えが見つかりませんでした. 私の回避策は、プリミティブ値NSNumberの代わりにラッパーを使用するようにプロパティをリファクタリングすることでした。int64_t

@property (strong, nonatomic) NSNumber *remoteID;
@property (strong, nonatomic) NSNumber *remoteArticleID;

もちろん、これは整数値のボックス化/ボックス化解除を意味します。

_noteObject.remoteArticleID = [NSNumber numberWithInt:1];

int intVar = [_noteObject.remoteArticleID intValue];
于 2013-07-01T14:17:01.333 に答える
0

モデル ファイルで、エンティティの "Class" プロパティがデフォルトではなく適切なクラスに設定されていることを確認しますNSManagedObject

エンティティ設定

のままにしておくとNSManagedObject、Core Data はNSManagedObject、独自のサブクラスを使用するのではなく、独自に生成したカスタム サブクラスにプロパティ自体を作成します。ほとんどのゲッターとセッターは動作するように見えますが、ボックス化されていないプリミティブ プロパティとカスタムのゲッターとセッターで問題が発生する場合があります。

于 2016-05-03T16:12:08.657 に答える