4

Appleのサンプルコードに正確に従ったコアデータコードがいくつかあります(特定の関数の例を満たす属性値の取得)。フィールドの最大値を取得するために使用しているので、そのエンティティタイプの次のオブジェクトを挿入するときにインクリメントできます。

NSXMLStoreTypeストアタイプをからに切り替えるまで、コードをまったく機能させることができませんでしたNSSQLiteStoreType。その後、突然すべてが機能しているように見えました。ただし、そうではありません。より高いオブジェクトを挿入した場合でも、常に同じ値が返されることに気付きました。しかし、終了して再度開いた後(したがって、データは永続化されて読み戻された後)、新しい挿入で更新されます。

それで、私は各挿入の後にコミットして保存し始めました。ただし、最初の「自動保存」の後、以下のエラーが発生します(2回続けて)。

-[NSCFNumberカウント]:認識されないセレクターがインスタンス0x100506a20に送信されました

これは、フェッチ要求を1回実行すると(2回続けて)発生します。

NSArray *objects = [context executeFetchRequest:request error:&error];

アップデート

コードをZombiesインストゥルメントで実行し、エラーが発生しているオブジェクトを確認することができました。mallocそれを割り当てるために実行される呼び出しは次のとおり-[NSUserDefaults(NSUserDefaults) initWithUser:]です。自分のデフォルトを設定していないので、これがどのオブジェクトであるかわかりません。

アップデート2

私はすべてのコードで「リリース」を検索し、静的アナライザーが文句を言わなかったことをreleaseすべてコメントアウトしました。autoreleaseまだエラーが発生しました。私は自分のコードの最後のrelease/をコメントアウトするところまで行って、それでもそれを手に入れました。autorelease今では、自分のコードが過剰にリリースされていないことをかなり確信しています。

アップデート3

この投稿にも同じ問題があるようですが、彼の解決策は意味がありません。彼は結果タイプをからNSDictionaryResultTypeに変更しましたがNSManagedObjectResultType、これは誤った結果を生成します。単一の値(max私が探している値)を返す代わりに、管理対象オブジェクトコンテキスト内のエンティティクラスのすべてのオブジェクトを返します。

スタックトレースの最上位レベルは次のとおりです(例外でブレークした場合、初めて):

#0  0x7fff802e00da in objc_exception_throw
#1  0x7fff837d6110 in -[NSObject(NSObject) doesNotRecognizeSelector:]
#2  0x7fff8374e91f in ___forwarding___
#3  0x7fff8374aa68 in __forwarding_prep_0___
#4  0x7fff801ef636 in +[_NSPredicateUtilities max:]
#5  0x7fff800d4a22 in -[NSFunctionExpression expressionValueWithObject:context:]
#6  0x7fff865f2e21 in -[NSMappedObjectStore executeFetchRequest:withContext:]
#7  0x7fff865f2580 in -[NSMappedObjectStore executeRequest:withContext:]

私はこの質問をウェブ上の他の多くのフォーラムで見ましたが、誰も実行可能な解決策を提供していません。好評につき、以下に独自のコードを追加しました。少し説明すると、私のエンティティの名前はBoxであり、値を取得しようとしているプロパティは属性である「sortOrder」Int 32です。

NSManagedObjectContext *context = [MyLibrary managedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Box"
                               inManagedObjectContext:context]];

// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];

// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"sortOrder"];

// Create an expression to represent the function you want to apply
NSExpression *expression = [NSExpression expressionForFunction:@"max:"
                                                     arguments:[NSArray arrayWithObject:keyPathExpression]];

// Create an expression description using the minExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];

// The name is the key that will be used in the dictionary for the return value.
[expressionDescription setName:@"maxSort"];
[expressionDescription setExpression:expression];
[expressionDescription setExpressionResultType:NSInteger32AttributeType];

// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];

// Execute the fetch.
NSError *error;
NSNumber *requestedValue = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
NSLog( @"objects: %@", objects );
if (objects != nil && [objects count] > 0) {
    requestedValue = [[objects objectAtIndex:0] valueForKey:@"maxSort"];
} else {
    [[NSApplication sharedApplication] presentError:error];
}

[expressionDescription release];
[request release];

NSLog( @"Max Sort Order: %@", requestedValue );
return requestedValue;
4

6 に答える 6

12

どうやらこれは既知のバグで、NSInMemoryStoreType データ ストアを使用しているときに発生します。NSSQLiteStoreType を使用すると正常に動作するようです。

ここで OpenRadar エントリを見つけることができます

このバグの重複を埋めました — 同じ問題に遭遇した人には、同じことをして、この迷惑な動作が文書化される可能性を高めることをお勧めします (または、さらに良いことに、修正されます)。

于 2012-12-03T10:42:00.013 に答える
3

メモリ管理の問題がある場合(セレクターが間違ったインスタンスに送信されることはメモリ管理の問題の兆候です)、実行できることがいくつかあります。

  1. Cocoaのメモリ管理ルールを読み直し、それらに従っていることを確認してください。
  2. 静的アナライザーを実行します。これにより、メモリ管理ルールを無視した場所が見つかることがよくあります。
  3. NSZombieEnabledを使用して、未割り当てのインスタンスにメッセージを送信しているかどうか[およびいつ]を確認してください。
于 2010-12-08T21:49:17.767 に答える
1

-[NSCFNumber count]: unrecognized selector sent to instance 0x100506a20つまり、NSCFNumber オブジェクトで count を呼び出していますが、NSCFNumber にはこのメソッドがありません。したがって、ほとんどの場合、count は割り当て解除された NSArray または NSSet オブジェクトに送信されます。

使用しNSZombieEnabled = YESます。何が起こるか教えてくれるかもしれません。設定方法については SO を検索してください。

于 2010-12-08T13:17:33.257 に答える
1

これは、バインディングが正しく設定されていない場合にも発生する可能性があります。たとえば、IB で「選択したタグ」の代わりに (またはそれに加えて) マトリックスのブール値を「コンテンツ」にバインドすると、このエラーが発生する可能性があります。

他のすべてが失敗した場合は、すべてのバインディングを切断し、一度に 1 つずつ再接続して、どれが原因かを確認します。

于 2012-08-25T16:02:04.623 に答える
0

パス式でキー path: を使用していますsortOrder。少なくとも XML データベースの場合、 Core-Dataは大文字と小文字を区別する型を処理できません。パスをsortorder(すべて小文字)に変更します

コントローラー クラスを使用している場合は、さらに問題が発生する可能性があります。

于 2012-11-27T21:53:04.233 に答える
0

まったく同じサンプルコードでまったく同じ問題が発生した後[request release] .

于 2011-06-07T01:44:57.653 に答える