Основная идея c о добавлении специализированного метода к существующему классу (UICOllectionViewCell
) через категорию - это просто замечательно.
Так что определение -(UIView*)hairuiView
круто.
Однако другие вещи, которые вы пытаетесь сделать, не крутые:
(1) Вы не можете переопределить метод через категорию.
Возможно (хотя и не поддерживается явно) переопределить метод, реализованный в суперклассе, но вы не можете переопределить метод в классе категории.
Компилятор часто разрешает это, но во время выполнения реализуется только один из методов (либо класс 'original'). метод или тот из категории), а не оба. И что еще хуже, нет никакой гарантии, какой из них выберет среда выполнения (все зависит от порядка загрузки классов).
Кроме того, [super ...]
в категории будет ссылаться на суперкласс класса, не класс, к которому вы добавляете категорию.
(2) Не следует использовать расширение для классов, которые вы не написали.
Расширение - это просто анонимная категория с некоторыми дополнительными перки. Однако вам следует создавать расширение только для написанного вами класса (и компилировать в этом проекте). Вы не можете добавлять расширения к классам, которые вам не принадлежат или уже скомпилированы. (Расширения позволяют определять дополнительные переменные экземпляра, и это можно сделать только один раз во время компиляции; вы не можете добавить переменные экземпляра в класс, который уже определен / скомпилирован.)
Поэтому придерживайтесь обычных категорий, чтобы расширить существующие классы. Ограничения по категориям, встроенные в язык, как правило, избавят вас от неприятностей - за исключением переопределения в (1).
Это нормально:
@interface BaseCollectionViewCell (HairuiView)
@property (nonatomic,readonly) UIView *hairuiView;
@end
@implementation BaseCollectionViewCell (HairuiView)
- (UIView*)hairuiView
{
...
}
@end