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

gle*_*enc 4 iphone core-data objective-c nsmanagedobject

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

@property (nonatomic, readonly) NSNumberFormatter *currencyFmt;
Run Code Online (Sandbox Code Playgroud)

此访问器的当前(无警告)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;
}
Run Code Online (Sandbox Code Playgroud)

调用primitiveValueForKey:是这里的问题,因为文档特别警告不要使用这个版本的原语查找:

强烈建议您使用动态生成的访问器而不是直接使用此方法(例如,primitiveName:而不是primitiveValueForKey:@"name").动态访问器更高效,并允许编译时检查.

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

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

任何帮助非常感谢.

Ole*_*ann 6

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

@interface MyManagedObject : NSManagedObject
...
@end

@interface MyManagedObject (PrimitiveAccessors)

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

@end
Run Code Online (Sandbox Code Playgroud)

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