无法摆脱瞬态属性getter impls中的primitiveValue访问器的编译器警告

时间:2010-12-30 18:40:43

标签: iphone objective-c core-data nsmanagedobject

我在我的应用程序中的一个模型上实现了如下的瞬态属性。它在模型设计中声明为具有未定义类型的瞬态属性。

@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;
}

此处调用primitiveValueForKey:是问题,因为documentation特别警告不要使用此版本的原语查找:

  

强烈建议您使用   动态生成的访问器   比直接使用这种方法(for   例如,primitiveName:而不是   primitiveValueForKey:@ “名”)。该   动态访问器更多   高效,并允许编译时   检查。

问题在于,如果我尝试使用primitiveCurrencyFmt而不是primitiveValueForKey:@"currencyFmt",我会收到编译器警告,说明该对象可能无法响应该选择器。如果我只是忽略这个警告,那么在运行时一切正常,但是警告很糟糕,而且我不想提交任何包含它们的代码。

我尝试在文件顶部使用@dynamic@synthesize声明属性,似乎没有任何帮助。如果不生成这些警告,我需要做什么才能使用推荐的动态访问器?

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:6)

在托管对象类的类别中声明方法:

@interface MyManagedObject : NSManagedObject
...
@end

@interface MyManagedObject (PrimitiveAccessors)

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

@end

Apple在文档中的几个位置使用此模式来禁止编译器警告。

答案 1 :(得分:0)

使用自动 - synthesize(自2010年以来,当被询问/回答时为新内容),您可以选择声明属性。减少代码,消除拼写错误等。

@interface MyManagedObject (PrimitiveAccessors)

@property (nonatomic) NSNumberFormatter *primitiveCurrencyFmt;

@end

Apple Example