Ios 在Objective-C中,扩展一个基类来过度渲染某些东西是一种反模式吗
在目标c中 假设我希望为UICollectionView提供自定义contentview(无论出于何种原因) 我意识到实现这一目标的唯一途径就是这样Ios 在Objective-C中,扩展一个基类来过度渲染某些东西是一种反模式吗,ios,objective-c,Ios,Objective C,在目标c中 假设我希望为UICollectionView提供自定义contentview(无论出于何种原因) 我意识到实现这一目标的唯一途径就是这样 @interface UICollectionViewCell (Extension) @property(nonatomic, readwrite)UIView *contentView; @end @interface BaseCollectionViewCell() @property(nonatomic, readonly)UIView
@interface UICollectionViewCell (Extension)
@property(nonatomic, readwrite)UIView *contentView;
@end
@interface BaseCollectionViewCell()
@property(nonatomic, readonly)UIView *hairuiView;
@end
@implementation BaseCollectionViewCell
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.contentView = [[UIView alloc] init];
}
return self;
}
@end
基本上,我将内容视图扩展为读写,这样现在我就可以将其变成我想要的任何自定义视图
这被认为是Objective-C中的反模式吗?通过一个类别向现有类(
UICOllectionViewCell
)添加一个专门方法的基本思想很好
所以定义-(UIView*)hairuiView
很酷
然而,你尝试做的其他事情并不酷:
(1) 不能通过类别重写方法
可以(尽管不明确支持)重写在超类中实现的方法,但不能重写类别类中的方法
编译器通常允许这样做,但在运行时只实现其中一个方法(类的原始方法或类别中的方法),而不是同时实现这两个方法。更糟糕的是,无法保证运行时会选择哪一个(这完全取决于类的加载顺序)
此外,类别中的[super…]
将引用类的超类,而不是要将类别添加到的类
(2) 您不应该在未编写的类上使用扩展
扩展只是一个匿名的类别,有一些额外的特权。但是,您应该只为您编写(并在该项目中编译)的类创建扩展。您不能将扩展添加到您不拥有或已编译的类中。(扩展允许定义其他实例变量,并且在编译期间只能执行一次;不能将实例变量添加到已定义/编译的类中。)
因此,坚持使用常规类别来扩展现有类。语言中内置的类别限制通常会让您免于麻烦,除了(1)中的覆盖
这么多没问题:
@interface BaseCollectionViewCell (HairuiView)
@property (nonatomic,readonly) UIView *hairuiView;
@end
@implementation BaseCollectionViewCell (HairuiView)
- (UIView*)hairuiView
{
...
}
@end
它可能有效,也可能无效,但我会担心弄乱您无法控制的类的内部。为什么不将自定义子视图添加到内容视图中,并使其与内容视图的大小相同?