2010-01-25 3 views
1

У меня есть несколько подклассов UITableViewCell от 2,0 дней, которые переопределяют устаревший обозначенный инициализатору:не __deprecated__ запуск компилятора предупреждения с подклассом

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier 

Этот код делает некоторые дополнительные настройки для ячейки, и я преобразуя классы использовать новый назначенный intializer:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 

что странно, в том, что единственное место, компилятор бросает предупреждение о методе устаревшим в самих подклассах, когда они называют

[super initWithStyle:style reuseIdentifier:reuseIdentifier] 

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

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier __attribute__ ((deprecated)); 

Как ни странно, теперь всех устаревание предупреждения ушло.

Одна вещь, которую я не пробовал, состоит в том, чтобы преобразовать подклассы, чтобы переопределить новый назначенный инициализатор, и посмотреть, будут ли места в коде, использующем эти ячейки, получать предупреждение о высвечивании из суперкласса.

Мне все еще кажется странным, что после того, как я добавил устаревший атрибут, все предупреждения ушли.

Любые идеи, почему это было бы?

ответ

1

Я считаю, проблема в том, что +alloc возвращает объект типа id, поэтому компилятор не уверен, что ваш -initWithFrame:reuseIdentifier: на самом деле тот же метод, что и тот, который устарел. Однако, когда вы вызываете [super initWithFrame:reuseIdentifier:], компилятор действительно знает, что метод устарел. Если вы попробуете что-то вроде [(MyTableCellClass *)[MyTableCellClass alloc] initWithFrame:frame reuseIdentifier:ident], я ожидаю, что это предупредит.

Хотя это на самом деле не объясняет, почему все предупреждения уходят, когда вы сами переопределяете метод.

+0

Я думаю, что вы один к чему-то там. Я забыл о возврате alloc (id), и компилятор не знал наверняка. Бьюсь об заклад, если я изменю подклассы, чтобы просто переопределить новый DI, то теперь использование классов будет помечено из-за устаревания в UITableViewCell. Пора попробовать. –

+0

Ну, я просто изменил все подклассы, чтобы переопределить initWithStyle: reuseIdentifer: и все использования initWithFrame: reuseIdentifer: по-прежнему не помечены. Хотя другие элементы UITableViewCell (т. Е. SetText :). Не то, чтобы это было абсолютно точно, но когда я щелкнул правой кнопкой мыши initWithFrame: reuseIdentifier: и выберите «Перейти к определению», я попал прямо в заголовок UITableViewCell, у которого есть отметки об отставке. Перед моим изменением я также получил все мои подклассы. –

+0

«Переход к определению» Xcode опирается на индексатор, который не совпадает с компилятором. Попробуйте выполнить листинг результата + alloc в подклассу соты. Причина, почему -setText: определенно будет работать, потому что вы вызываете ее на переменной соответствующего типа. Аналогичным образом должно работать следующее: 'MyTableViewCell * cell = [MyTableViewCell alloc]; [cell initWithFrame: frame reuseIdentifier: ident]; ' –

Смежные вопросы