1

私はこのオブジェクトを持っています:

@interface Song : NSManagedObject

@property (nonatomic, strong) NSString *songName;
@property (nonatomic) int32_t achievedPoints;

このようにプロパティを設定すると

Song *song1 = [[SongStore sharedStore] createSong]; 
song1.songName = @"Song 1";
song1.achievedPoints = 0;

すべてが機能しますが、achievedPoints変数を0以外に設定しようとすると、EXC_BAD_ACCESSが取得されます。

これは、createSongメソッドが行うことです。

- (Song *)createSong {
    double order;
    if ([allSongs count] == 0) {
        order = 1.0;
    } else {
        order = [[allSongs lastObject] orderingValue] + 1.0;
    }

    Song *p = [NSEntityDescription insertNewObjectForEntityForName:@"Song" inManagedObjectContext:context];

    [p setOrderingValue:order];
    [allSongs addObject:p];
    return p;
}

値を取得して0に設定することが機能する理由はわかりませんが、ゼロ以外のものを指定するとプログラムがクラッシュします。どんな助けでも大歓迎です。

4

2 に答える 2

4

これは私に一度起こったことがあります。どの設定が混乱するかは正確にはわかりませんが、管理対象オブジェクトモデルには、クラスがプリミティブ値(int、floatなど)またはオブジェクト値(NSNumber *)のどちらを使用するかを制御する設定があると思います。 、など)その値を設定します。これが台無しになり、実際にオブジェクトを設定しているときにプリミティブを設定していると思われる場合は、次のようになります。

//song1.achievedPoints = 0;
song1.achievedPoints = (NSNumber *)0x00000000; 
//This is OK because it is the same as nil

//song1.achievedPoints = 1;
song1.achievedPoints = (NSNumber *)0x00000001; //You can see why this is bad!

私の解決策は、Create NSManagedObject Subclassテンプレートを使用してクラスを再生成し、[プリミティブにスカラー値を使用する]がオンになっていることを確認することでした。

于 2013-02-21T13:00:24.353 に答える
0

この問題は、エンティティがクラスファイルに正しくリンクされていなかったために発生しました。これが発生すると、Core Dataは独自のサブクラスを使用するのではなく、動的に独自のサブクラスを作成し、そのサブクラスのセッターはボックス化されたプリミティブを期待します。

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

エンティティ構成

XCodeのCreateNSManagedObjectSubclassテンプレートを使用する、XCodeはモデルファイル内の対応するエンティティにこの値を自動的に設定します。これはおそらくborrrdenの問題を修正したものです。ただし、この値が正しく設定されていることを確認することで、新しいファイルを作成せずに同じ結果を達成できるはずです。

于 2016-05-03T21:44:17.350 に答える