Не удается избавиться от предупреждений компилятора для методов доступа primitiveValue в переходных методах получения свойств - PullRequest
4 голосов
/ 30 декабря 2010

Я реализовал переходное свойство, как показано ниже, для одной из моделей в моем приложении.Он объявлен в дизайне модели как временное свойство с неопределенным типом.

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

Вызов *Здесь проблема 1007 *, поскольку документация специально предупреждает против использования этой версии примитивного поиска:

Настоятельно рекомендуется использовать динамически генерируемые средства доступа, а не использоватьэтот метод напрямую (например, primitiveName: вместо primitiveValueForKey: @ "name").Динамические средства доступа гораздо эффективнее и позволяют выполнять проверку во время компиляции.

Проблема заключается в том, что если я пытаюсь использовать primitiveCurrencyFmt вместо primitiveValueForKey:@"currencyFmt", я получаю предупреждение компилятора о том, чтообъект может не отвечать на этот селектор.Все работает нормально во время выполнения, если я просто игнорирую это предупреждение, но предупреждения ужасны, и я не хочу фиксировать какой-либо код, в котором они есть.

Я попытался объявить свойство с помощью @dynamic и @synthesize вверху файла и ничего не помогает.Что мне нужно сделать, чтобы использовать рекомендуемые динамические средства доступа без генерации этих предупреждений?

Любая помощь, высоко ценимая.

Ответы [ 2 ]

6 голосов
/ 30 декабря 2010

Объявите методы в категории класса управляемых объектов:

@interface MyManagedObject : NSManagedObject
...
@end

@interface MyManagedObject (PrimitiveAccessors)

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

@end

Apple использует этот шаблон в нескольких местах в документации для подавления предупреждений компилятора.

0 голосов
/ 23 января 2014

С auto- synthesize (впервые с 2010 года, когда об этом спросили / ответили), вы можете вместо этого объявить свойства.Меньше кода, устранение опечаток и т. Д.

@interface MyManagedObject (PrimitiveAccessors)

@property (nonatomic) NSNumberFormatter *primitiveCurrencyFmt;

@end

Пример Apple .

...