1

anImage.URL の値が突然 nil になるバグがあります。anImage はクラス Image のオブジェクトです。配列にはそのような値が 5 つあります。どういうわけか、そのうちの少なくとも 1 つは何らかの形で URL が nil になっています。

そのことがどこで変更されたのかわかりません。

だから私はこれを anImage.URL = something のカテゴリとして設定しました

-(void) setURL:(NSString *)URL
{

    [super setValue:URL forKey:NSStringFromSelector(@selector(URL))];
}

そして、そこにブレークポイントを設定します。

ただし、単純に再帰的に自分自身を呼び出すため、問題が発生します。

私は何をすべきか?

値の変更が実際に機能しない場合、デバッガーは中断します。やっぱり配列です。とにかく何を見て設定すればいいですか?

keyValueObserving の使い方がわかりません。

基本的に、 -(void) setURL:(NSString *)URL を再実装して、以前とまったく同じように動作させたいと考えています。唯一の違いは、そこにブレークポイントを置きたいということです。

4

2 に答える 2

3

デバッグまたはブレークポイントの設定のためのカスタム セッター メソッドを実装できます。

例は、「Core Data Programming Guide」のCustom Attribute and To-One Relationship Accessor Methodsにあります。

管理対象オブジェクトのサブクラス「Image」にカテゴリ (「MyAccessors」など) を作成します (まだ作成していない場合)。実装ファイル「Image+MyAccessors.m」に追加します

@interface Image (PrimitiveAccessors)
- (void) setPrimitiveURL:(NSString *)newURL;
@end

@implementation Image (MyAccessors)

- (void)setURL:(NSString *)newURL
{
    [self willChangeValueForKey:@"URL"];
    [self setPrimitiveURL:newURL];
    [self didChangeValueForKey:@"URL"];
}

@end

「トリック」は (これを理解するのに少し時間がかかりました)、カスタム アクセサー メソッドを実装するカテゴリではなく、別のカテゴリでプリミティブ アクセサーを宣言する必要があることです。

または、次のようにカスタム アクセサーを実装できます。

- (void)setURL:(NSString *)newURL
{
    [self willChangeValueForKey:@"URL"];
    [self setPrimitiveValue:newURL forKey:@"URL"];
    [self didChangeValueForKey:@"URL"];
}

この場合、プリミティブ アクセサー メソッドを宣言する必要はありません。

于 2012-11-15T21:58:32.680 に答える
0

これは質問に対する直接的な答えではありません。問題は、これをデバッグする方法です。

さて、私はバグを見つけました。NSManagedObject が不規則に動作する場合は、スレッド間で managedObject コンテキストを使用していないことを確認してください。技術的には、ブロックを実行できますが、それは別の話です。

これを共有したいだけです。後でマーティンのソリューションを試します。

于 2012-11-16T08:43:54.790 に答える