2011-10-14 1 views
0

私はのコアデータエンティティindexCurrentを持っています。外部のクラスがindexCurrentにアクセスするとき、私は彼らに返す前にindexCurrentの値を更新する必要があるかどうかをチェックするために使用できるargを送信します。したがって私はindexCurrentをプライベート変数として宣言し、argを使ってその特別なメソッドを通してのみ外部へのアクセスを許可しています。コアデータの一時的な属性を非公開にすることができません

しかし、コンパイラは "メソッドが見つかりません"という警告を発行しますが、外部クラスはindexCurrentsetindexCurrent:の両方を呼び出すことができます。このエラーコードは完全に成功して実行されます。ここで

Seriesインタフェースです:

@interface Series : NSManagedObject { 
@private 
NSNumber *indexCurrent; 
} 

indexCurrentがpropertizedされていない、実装ファイル内の動的として宣言されていない、と私はindexCurrentまたはsetindexCurrent:アクセサを書いていません。

私は間違っていますか? indexCurrentを非公開にするにはどうすればよいですか?

答えて

2

@dynamicによってコードが生成されることはありません。コアデータは、@dynamicを使用するかどうかに関係なく、プロパティアクセサのコードを生成します。 @dynamicは、コードが生成されることをコンパイラに通知するだけで、欠落しているメソッドについて警告する必要はありません。そのため、警告は表示されますが、ランタイムエラーは発生しません。

インスタンス変数の@privateはあまり効果がありません。デフォルトは@protectedです。つまり、外部のクラスはクラスにアクセスすることはできません。クラス自体とサブクラスのみです。いずれの場合でも、デフォルトのCore Dataアクセサはインスタンス変数を使用しません。

私はあなたがしたいことをする方法がわかりません。

+0

私は、個人的な管理対象オブジェクトの属性と同じものではないと考えています。ドット構文がないことに頼らざるを得ません(これは@property行なしでは機能しません)私のデザインを強制する。あなたの解説に感謝します。これは、Core Dataに関する素晴らしい解剖学のレッスンです。 – Wienke

+1

publicとprivateの概念全体はObjective-Cのデザインパターンではありません。それは存在しますが、私はそれに依存しません。人間が読んで、「ああ、私はそれに触れてはいけない」と言っても、マーカーはそこにある。コンパイラは、その警告を無視すると、あなたの方法で取得するつもりはありません。 –

関連する問題