gpt4 book ai didi

objective-c - 在 Objective-C 中不链接初始化器可以吗?

转载 作者:行者123 更新时间:2023-12-03 17:29:35 25 4
gpt4 key购买 nike

我正在 iPhone 上使用 Objective-C/Cocoa-Touch 进​​行编码,我想知道,不链接​​初始化器是否可以?例如,在我的父类中,我有三个初始值设定项,它们都需要由子类继承。在这种情况下不链式可以吗?例如,在这一个类中,我将其设置如下:

- (id)initWithGraphic:(Graphic*)graphic size:(CGSize)size
{
self = [super initWithFrame:CGRectZero];
if (self)
{
...

}
return self;
}

- (id)initWithGraphic:(Graphic*)graphic maximumDimension:(CGFloat)maximumDimension
{
self = [super initWithFrame:CGRectZero];
if (self)
{
...

}
return self;
}

- (id)initWithGraphic:(Graphic*)graphic
{
self = [super initWithFrame:CGRectZero];
if (self)
{
...

}
return self;
}

所以基本上我没有一个指定的初始化程序,因为我很难将它们链接在一起,我基本上有三个。

最佳答案

简短的回答:如果您希望代码易于理解和维护,那么您必须始终调用 super的指定初始值设定项。

长答案...

-[NSObject init]方法是documented to do nothing :

The init method defined in the NSObject class does no initialization; it simply returns self.

因此理论上您不需要调用它。实际上,最好调用它,因为它使您的代码更加统一(因此更容易理解),并且如果您决定更改类以从 NSObject 以外的其他类继承,则不太可能中断。 .

如果你有一些继承链MyGrandparent > MyParent > MyObject ,并且您是 MyParent 的实现者和MyObject ,和MyParent不会覆盖所有 MyGrandparent的初始值设定项,那么您可以直接调用 MyGrandparent 之一来自 MyObject 的非重写初始值设定项初始化器。但同样,这是一个坏主意。当您或其他人稍后必须重新访问代码时,这会令人困惑,并且如果您更改 MyParent 的实现,则可能会中断。稍后。

此外,如果您要创建多个初始值设定项,则需要了解指定初始值设定项herehere 。选择一个初始化器作为指定初始化器非常重要,并确保所有子类初始化器直接调用父类(super class)的指定初始化器。否则,您可能最终会创建无限递归。我在this answer中彻底解释了这个问题和this answer .

更新

在您的示例中,您可以设置一个指定的初始值设定项,如下所示:

static CGFloat const kMaximumDimensionNone = 0; // or NAN if 0 is a valid max dimension
static CGSize const kSizeNone = { 0, 0 }; // or NAN, NAN if 0x0 is a valid size

- (id)initWithGraphic:(Graphic *)graphic size:(CGSize)size maximumDimension:(CGFloat)maximumDimension {
if (self = [super init]) {
_graphic = graphic;
if (!CGSizeEqualToSize(size, kSizeNone)) {
[self configureWithSize:size];
}
else if (maximumDimension != kMaximumDimensionNone) {
// Use if(!isnan(maximumDimension)) instead if you use NAN as the placeholder
[self configureWithMaximumDimension:maximumDimension];
}
else {
[self configureWithDefaultDimensions];
}
}
return self;
}

- (id)initWithGraphic:(Graphic *)graphic {
return [self initWithGraphic:graphic size:kSizeNone maximumDimension:kMaximumDimensionNone];
}

- (id)initWithGraphic:(Graphic *)graphic size:(CGSize)size {
return [self initWithGraphic:graphic size:size maximumDimension:kMaximumDimensionNone];
}

- (id)initWithGraphic:(Graphic *)graphic maximumDimension:(CGFloat)maximumDimension {
return [self initWithGraphic:graphic size:kSizeNone maximumDimension:kMaximumDimensionNone];
}

您不必在公共(public)头文件中公开指定的初始值设定项。您可以添加一个单独的头文件,公开要导入的子类的指定初始值设定项。例如,Apple 使用 UIGestureRecognizerSubclass.h 来实现此目的 header ,声明 ForSubclassEyesOnly类别 UIGestureRecognizer .

或者您可以公开 configureWith...方法到您的子类中,也许您甚至不需要让它们覆盖初始值设定项。

关于objective-c - 在 Objective-C 中不链接初始化器可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12870840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com