2010-12-30 7 views
4

私のアプリのモデルのいずれかで以下のように一時プロパティを実装しました。モデル設計では、未定義型の一時プロパティとして宣言されています。一時的なプロパティのprimitiveValueアクセサのコンパイラ警告を取り除くことはできませんgetter impls

@property (nonatomic, readonly) NSNumberFormatter *currencyFmt; 

このアクセサの電流(警告フリー)IMPLは次のとおりです。

- (NSNumberFormatter *) currencyFmt 
{ 
    [self willAccessValueForKey:@"currencyFmt"]; 
    NSNumberFormatter *fmt = [self primitiveValueForKey:@"currencyFmt"]; 
    [self didAccessValueForKey:@"currencyFmt"]; 

    if (fmt == nil) 
    { 
     fmt = [[[NSNumberFormatter alloc] init] autorelease]; 
     [fmt setNumberStyle:NSNumberFormatterCurrencyStyle]; 
     [fmt setLocale:[self localeObject]]; 
     [self setPrimitiveValue:fmt forKey:@"currencyFmt"]; 
    } 

    return fmt; 
} 

documentationが、具体的プリミティブのルックアップのこのバージョンを使用しないことを警告しているので、primitiveValueForKey:への呼び出しは、ここで問題です。

あなたは強く、このメソッドのディレクトリを使用するのではなく、 を 動的に生成されるアクセサを使用することをお勧めします( の例では、primitiveName:が の代わりにprimitiveValueForKey:@ "name"の代わりに使用されます)。 動的アクセサーは効率的に であり、コンパイル時には のチェックが可能です。

問題は、私はprimitiveCurrencyFmtの代わりprimitiveValueForKey:@"currencyFmt"を使用しようとすると、私はオブジェクトがそのセレクタに応答しないことを言って、コンパイラの警告が出ていることです。私はこの警告を無視すれば、実行時にすべてうまく動作しますが、警告はひどいので、そこにあるコードをコミットしたくありません。

ファイルの先頭に@dynamic@synthesizeというプロパティを宣言してみましたが、何も助けにならないようです。これらの警告を生成せずに推奨されるダイナミックアクセサを使用するには、何が必要ですか?

ご迷惑をおかけして申し訳ございません。

答えて

6

管理対象オブジェクトクラス上のカテゴリのメソッドを宣言します。

@interface MyManagedObject : NSManagedObject 
... 
@end 

@interface MyManagedObject (PrimitiveAccessors) 

- (NSNumberFormatter*)primitiveCurrencyFmt; 
- (void)setPrimitiveCurrencyFmt:(NSNumberFormatter*)value; 

@end 

アップルは、コンパイラの警告を抑制するためにドキュメントのいくつかの場所でこのパターンを使用しています。

+0

優秀、ちょうど私が必要なもの!ありがとう。 – glenc

0

auto-synthesize(これは尋ねられた/回答された2010年以来)と、代わりにプロパティを宣言することができます。コードを減らし、タイプミスなどをなくす。

@interface MyManagedObject (PrimitiveAccessors) 

@property (nonatomic) NSNumberFormatter *primitiveCurrencyFmt; 

@end 

Apple Example

関連する問題