我在我的应用程序中的一个模型上实现了如下的瞬态属性。它在模型设计中声明为具有未定义类型的瞬态属性。
@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
声明属性,似乎没有任何帮助。如果不生成这些警告,我需要做什么才能使用推荐的动态访问器?
任何帮助都非常感激。
答案 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