Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Objective-C中,扩展一个基类来过度渲染某些东西是一种反模式吗_Ios_Objective C - Fatal编程技术网

Ios 在Objective-C中,扩展一个基类来过度渲染某些东西是一种反模式吗

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

在目标c中

假设我希望为UICollectionView提供自定义contentview(无论出于何种原因)

我意识到实现这一目标的唯一途径就是这样

@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

它可能有效,也可能无效,但我会担心弄乱您无法控制的类的内部。为什么不将自定义子视图添加到内容视图中,并使其与内容视图的大小相同?