Игнорирование типа свойства несовместимо с типом, унаследованным от предупреждения в Objective-C.

В подклассе я переопределяю тип свойства, чтобы он был подклассом этого свойства, что работает следующим образом:

ClassA: NSObject
@property (nonatomic) NSValue *value;

ClassB : ClassA
@property (nonatomic) NSNumber *value;

Однако я обнаружил, что если ClassA не #import класс NSNumber, то ClassB будет иметь предупреждение в виде: Property type 'NSNumber *' is incompatible with type 'NSValue *' inherited from 'ClassA'.

Я не хочу иметь кучу ненужного импорта в ClassA. Как я могу отменить предупреждение от Clang об этом? Я знаю, что синтаксис:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-somethingGoesHere"
#pragma clang diagnostic pop

Но я не знаю, какой флаг я должен пройти. Есть ли место, где я могу посмотреть, какой флаг передать для этого предупреждения? Я сослался на руководство пользователя Clang и попытался отключить все предупреждения только для этой строки с помощью "-w" флаг, но это не сработало.


person MaxGabriel    schedule 28.02.2013    source источник
comment
Я узнал, что -fdiagnostics-show-option можно передать в Clang, чтобы показать связанную группу предупреждений для предупреждения (которую вы можете использовать для подавления этой группы предупреждений). Я не уверен, как просмотреть это в Xcode, поэтому я скомпилировал в командной строке. К сожалению, несмотря на то, что у меня есть группы предупреждений о циклах сохранения и т. д., для этого конкретного предупреждения ничего не было напечатано, поэтому конкретного флага может не быть.   -  person MaxGabriel    schedule 28.02.2013


Ответы (3)


Я столкнулся с проблемой, немного похожей на вашу проблему, надеюсь, этот ответ сработает и для вас. вопрос.

и теперь у меня есть решение игнорировать предупреждения. надеюсь, что это решение поможет и вам.

person ShujatAli    schedule 28.05.2014

Вы можете показать предупреждение в действиях журнала сборки Xcode и найти флаг clang. Попробуй это:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wincompatible-property-type"
...
#pragma clang diagnostic pop
person Itachi    schedule 28.03.2019
comment
Для получения дополнительной информации: releases.llvm.org/8.0.0/ инструменты/клэнг/документы/ - person blastervla; 03.12.2019

Вы не должны переопределять свойства в подклассах. Я понимаю, почему вы думаете, что должны, но это действительно неправильный дизайн. Назовите второй как-нибудь иначе, например, "numberValue".

person EricS    schedule 28.02.2013
comment
Это не имеет смысла. Подклассы в некотором роде специализируются по отношению к своему суперклассу, то есть подкласс UITableViewCell может указать, что его свойство backgroundView является UIImageView, чтобы он мог рисовать изображение в качестве фона. Более того, для него нет предупреждения, когда классы #импортируются в шапке, указывая на то, что с ним проблем нет. - person MaxGabriel; 28.02.2013
comment
Причина, по которой это плохо, заключается в том, что код в B всегда будет предполагать, что значение является NSNumber, в то время как код в A может установить значение в NSValue. Это может привести к исключениям во время выполнения в B, потому что вы потеряли проверку типов во время компиляции. В этот момент вы могли бы просто использовать идентификатор для значения. - person EricS; 28.02.2013