1

私は当初、これはマルチスレッド指向のクラッシュだと思っていたので、MOC の performBLock メソッドと performBlockAndWait メソッドを使用して、実際のコア データ作業をすべてメイン スレッドに移動しました。

行ったことは、マージを行った場所から「保存」と呼ばれる場所にクラッシュを移動したことだけです。

この時点では、どこからエラーのチェックを開始すればよいかさえわかりません。

マルチスレッドではありません。コア データのすべての作業はメイン スレッドにエクスポートされます。

すべてのサブクラスを再作成したので、(理論的には) サブクラスとそれが表すエンティティとの不一致になることはありません。

さらに厄介なのは、メイン ブロックで実行する以外に、コア データ モデルを更新するために使用するコードがいくつかのバージョンで変更されていないことです。これは、コードの奥深くに何らかの深刻な欠陥があることを示唆しており、手がかりがありません。どこにあるのか、どうやって見つけるのか。

このクラッシュを追跡するのに役立つ情報やアドバイスをいただければ幸いです。

CoreData: error: Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  NSManagedObjects of entity 'AdBlock' do not support -mutableSetValueForKey: for the property 'currentlyValidAds' with userInfo (null)

2012-09-25 14:50:13.250 CoreApp[1173:fb03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSManagedObjects of entity 'AdBlock' do not support -mutableSetValueForKey: for the property 'currentlyValidAds''

AdBlock には、Advertisement クラスとの多対多、オプション、順序付き、一時的な関係 'currentlyValidAds' があります。コメントに応じて、対1のオプションの一時的な関係である逆の関係を確認しました。(多対多、オプション、順序付き、一時的な関係になるように更新しましたが、バグは残っています)。

要求に応じて、生成されたコード:

AdBlock.h:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Advertisement;

@interface AdBlock : NSManagedObject

@property (nonatomic, retain) NSNumber * adIndex;
@property (nonatomic, retain) NSNumber * block_id;
@property (nonatomic, retain) NSNumber * seedBlock;
@property (nonatomic, retain) NSSet *ads;
@property (nonatomic, retain) NSOrderedSet *currentlyValidAds;
@end

@interface AdBlock (CoreDataGeneratedAccessors)

- (void)addAdsObject:(Advertisement *)value;
- (void)removeAdsObject:(Advertisement *)value;
- (void)addAds:(NSSet *)values;
- (void)removeAds:(NSSet *)values;

- (void)insertObject:(Advertisement *)value inCurrentlyValidAdsAtIndex:(NSUInteger)idx;
- (void)removeObjectFromCurrentlyValidAdsAtIndex:(NSUInteger)idx;
- (void)insertCurrentlyValidAds:(NSArray *)value atIndexes:(NSIndexSet *)indexes;
- (void)removeCurrentlyValidAdsAtIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectInCurrentlyValidAdsAtIndex:(NSUInteger)idx withObject:(Advertisement *)value;
- (void)replaceCurrentlyValidAdsAtIndexes:(NSIndexSet *)indexes withCurrentlyValidAds:(NSArray *)values;
- (void)addCurrentlyValidAdsObject:(Advertisement *)value;
- (void)removeCurrentlyValidAdsObject:(Advertisement *)value;
- (void)addCurrentlyValidAds:(NSOrderedSet *)values;
- (void)removeCurrentlyValidAds:(NSOrderedSet *)values;
@end


#import "AdBlock.h"
#import "Advertisement.h"

AdBlock.m

@implementation AdBlock

@dynamic adIndex;
@dynamic block_id;
@dynamic seedBlock;
@dynamic ads;
@dynamic currentlyValidAds;

@end

主に現在有効な広告を更新するロジックを提供するカテゴリもありますが、クラッシュを実行しているコード ブロックでは使用されていないため、含めません。

編集:

根本的な質問には答えていませんが、削除したオブジェクトの一時的な値を手動で nil に設定することで、クラッシュのバグを解決しました。なぜこれが役に立ったのかわかりません...睡眠不足によるランダムなアイデアです。

4

0 に答える 0