2

私はobjective-cは初めてですが、長年コーディングしています。なんとなくObjective-Cに熱中しません。私はGoogleとstackoverflowを検索しましたが、私の問題は単純で愚かで、まだ誰もこれを尋ねていないと思います.

私のコードは DateSelectionTitles Example に基づいています。http://developer.apple.com/library/ios/#samplecode/DateSectionTitles/Introduction/Intro.html

私は NSManagedObject を持っています

@interface Event : NSManagedObject

@property (nonatomic, retain) NSDate * date;
...

// Cache
@property (nonatomic, retain) NSString * primitiveSectionIdentifier;

すべてのプロパティは、primitiveSectionIdentifier を除いて、私のデータモデルで定義されています (リンゴの例のように)

でも電話したら

NSString *tmp = [self primitiveSectionIdentifier];

私は例外を取得します

キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。

簡単に言えば:

Event *foo = [[Event alloc] init];

if (foo.primitiveSectionIdentifier) {
    NSLog(@"YEAH");
}

同じ例外をスローします。したがって、基本的には、primitiveSectionIdentifier が nil かどうかを確認したいと考えています。しかし、プロパティにアクセスすると、例外がスローされますか? 値があるかどうかを確認する前に、各プロパティを割り当てる必要がありますか?!

Objective-C の基礎のうち、ここで得られないものはどれですか?

回答ありがとうございます。

4

2 に答える 2

1

コンパイラの警告なしでこれが発生する方法は 1 つしかありません@dynamic primitiveSectionIdentifier;。実装ファイルに記述しておく必要があります。これは、メソッドが別の場所で既に定義されていると考えているため、メソッドを定義したくないことを意味します。

を使用してNSManagedObjectいますが、それがどのように機能するか知っていますか? 実装なしでメソッドを宣言し (実装を入れる@dynamic)、メソッドが呼び出されると、メソッドが見つからず、[NSObject doesNotRecognizeSelector:]代わりに特別なハンドラーが呼び出されます。このハンドラーは、指定されたセレクターの属性が存在するかどうかを Core Data モデルでチェックし、存在しない場合は、表示されている例外をスローします。

したがって、primitiveSectionIdentifierモデルで宣言されていないことが原因で問題が発生する可能性があります。

于 2012-11-01T18:59:51.600 に答える
1

異なるスタイルのメモリ管理を使用する古いサンプル プログラムを使用しています。iOS 5 または 6 でコンパイルしている場合、それが問題を引き起こしている可能性があります。

試す

NSLog(@"primitiveSectionIdentifier = %@", self.primitiveSectionIdentifier);

探している文字列が得られない場合は、文字列オブジェクトが初期化されておらず、まだ nil に設定されている可能性があります。その場合、コードはコンパイルされますが、セレクターを nil ポインターに送信すると、例外がスローされます。

于 2012-11-01T18:08:13.313 に答える