Objective c 指定初始值设定项的代码是什么样的?

Objective c 指定初始值设定项的代码是什么样的?,objective-c,Objective C,我已经查阅了很多关于init和初始值设定项概念的书籍和论坛帖子,但是我仍然无法理解指定的初始值设定项 它的代码是什么样子的 在下面的代码中,哪个代码行是指定的初始值设定项 -( Fraction *) initWith (int) n over: (int) d { self = [ super init]; if (self) [self setTo: n over: d ]; return self; } 多谢各位 每个初始值设定项必须在其实

我已经查阅了很多关于init和初始值设定项概念的书籍和论坛帖子,但是我仍然无法理解指定的初始值设定项

它的代码是什么样子的

在下面的代码中,哪个代码行是指定的初始值设定项

-( Fraction *) initWith (int) n over: (int) d
{
    self  = [ super init];
    if (self) 
        [self setTo: n over: d ];
    return self; 
} 

多谢各位

每个初始值设定项必须在其实现中调用指定的初始值设定项

在这种情况下,
[super init]
调用是对类的超类初始值设定项的调用,因此这可能是设计的初始值设定项本身

指定的初始值设定项可以是多个,具体取决于特定的类。为了找到那些,您需要检查文档

例如,
UIView
有两个指定的初始值设定项

  • -initWithFrame:
  • -initWithCoder:
您必须在自定义
UIView
子类中的任何其他初始值设定项中调用其中一个


有关更多详细信息,请参见(感谢Seamus)

每个初始值设定项在其实现中都必须调用指定的初始值设定项

在这种情况下,
[super init]
调用是对类的超类初始值设定项的调用,因此这可能是设计的初始值设定项本身

指定的初始值设定项可以是多个,具体取决于特定的类。为了找到那些,您需要检查文档

例如,
UIView
有两个指定的初始值设定项

  • -initWithFrame:
  • -initWithCoder:
您必须在自定义
UIView
子类中的任何其他初始值设定项中调用其中一个


有关更多详细信息,请参见(谢谢Seamus)

您对“指定初始值设定项”的含义有点困惑。一个类可能有几个初始化器。让我们选一个虚构的猫类。它可能具有以下初始值设定项:

- init
- initWithName:
- initWithName:breed:
- initWithName:breed:age:
指定的初始值设定项实际执行该类的初始化并调用
super
。最后一个,
initWithName:bride:age
可能是指定的初始值设定项,因为它获取的数据最多。它可以这样实现:

- (id)initWithName:(NSString *)name breed:(CatBreed)breed age:(NSUInteger)age {
    if (self = [super init]) {
        _name = [name copy];
        _breed = breed;
        _age = age;
    }
    return self;
}
- (id)initWithName:(NSString *)name {
    return [self initWithName:name breed:CatBreedTabby age:0];
}
这完成了设置实例的所有工作。其他初始值设定者将根据此初始值设定来实施。例如,另一个可能是这样实现的:

- (id)initWithName:(NSString *)name breed:(CatBreed)breed age:(NSUInteger)age {
    if (self = [super init]) {
        _name = [name copy];
        _breed = breed;
        _age = age;
    }
    return self;
}
- (id)initWithName:(NSString *)name {
    return [self initWithName:name breed:CatBreedTabby age:0];
}

因此,要更改子类中类的初始化行为,只需更改指定的初始值设定项,就可以免费获得其他初始值设定项。

您对短语“指定的初始值设定项”的含义有点困惑。一个类可能有几个初始化器。让我们选一个虚构的猫类。它可能具有以下初始值设定项:

- init
- initWithName:
- initWithName:breed:
- initWithName:breed:age:
指定的初始值设定项实际执行该类的初始化并调用
super
。最后一个,
initWithName:bride:age
可能是指定的初始值设定项,因为它获取的数据最多。它可以这样实现:

- (id)initWithName:(NSString *)name breed:(CatBreed)breed age:(NSUInteger)age {
    if (self = [super init]) {
        _name = [name copy];
        _breed = breed;
        _age = age;
    }
    return self;
}
- (id)initWithName:(NSString *)name {
    return [self initWithName:name breed:CatBreedTabby age:0];
}
这完成了设置实例的所有工作。其他初始值设定者将根据此初始值设定来实施。例如,另一个可能是这样实现的:

- (id)initWithName:(NSString *)name breed:(CatBreed)breed age:(NSUInteger)age {
    if (self = [super init]) {
        _name = [name copy];
        _breed = breed;
        _age = age;
    }
    return self;
}
- (id)initWithName:(NSString *)name {
    return [self initWithName:name breed:CatBreedTabby age:0];
}

因此,要更改子类中类的初始化行为,只需更改指定的初始值设定项,就可以免费获得其他初始值设定项。

有关更多详细信息,请参阅小说明中的“多个初始值设定项和指定的初始值设定项:
[super init]
是对超类的初始值设定项的调用-它不是相关类的指定初始值设定项。有关更多详细信息,请参阅小说明中的“多个初始值设定项和指定初始值设定项:
[super init]
是对超类的初始值设定项的调用-它不是所讨论的类的指定初始值设定项。感谢Chuck的出色响应。我还有一个问题。当super初始化时,是否会创建该超类的对象,然后将其存储在self中?@danielle:No.
super
是一个相当于
self
的关键字,但会运行超类版本的方法,而不是当前类的方法。因此,它只是在
self
上运行超类初始值设定项,以设置从超类继承的任何实例变量等。谢谢Chuck。我知道我已经说过这是我的最后一个问题,但我想我还需要澄清一件事,然后才能完全理解init。初始化一个方法到底意味着什么?这是否意味着在分配了类内存之后,类对象被赋予了零的“初始”(如在初始化中)值?什么是自我?自我是目标吗?您所引用的实例变量是像*myFraction这样的实例变量,它保存对数据的引用,还是像存储在对象中的分子?抱歉问了这么多问题。我已经试着在网上找到这些问题的答案了,现在已经有几个小时没有问基本的问题了。但是,不幸的是,我不得不这么做,因为我自己还没有取得任何突破。@Danielle:是的,初始化器是一种将对象设置为某种初始状态的方法。这并不一定是“一切都是零”——例如,上面显示的
initWithName:bride:age:
方法将实例变量初始化为要传入的任何值。至于你剩下的问题,听起来你可以对Objective-C做一个很好的介绍。苹果有一个-这将给你一个良好的基础。希望能有帮助。谢谢Chuck的回复。我还有一个问题。当super初始化时,是否会创建该超类的对象,然后将其存储在self中?@danielle:No.
super
是一个与
self
等价的关键字,但会运行该超类版本的methodo