2013-04-10 109 views
0

我已经研究过关于init和初始化器概念的书籍和多个论坛帖子,但是我仍然无法在指定的初始化程序周围找到我的头。指定初始值设定项的代码是什么样的?

它的代码是什么样的?

在下面的代码中,哪些代码行是指定的初始化程序?

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

谢谢。

回答

2

每个初始化程序必须在其实现中调用指定的初始化程序。

在这种情况下,[super init]调用是对类的超类初始化程序的调用,所以这很可能是设计的初始化程序本身。

根据具体的类别,指定的初始值设定项可能不止一个。为了找到那些,你需要检查文档。

例如UIView有两个指定初始化

  • -initWithFrame:
  • -initWithCoder:

,你必须调用这两个中的一个在任何其他初始化你可能在你的自定义UIView子类。

有关详细信息,请参阅Multiple Initializers and the Designated Initializer(感谢西莫)

+2

有关更多详细信息,请参阅http://developer.apple.com/library/ios/#documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html – 2013-04-10 22:39:11

+1

中的“多个初始化程序和指定初始化程序”小澄清:' [super init]'是对*超类的*初始化程序的调用 - 它不是所讨论类的指定初始值设定项。 – Chuck 2013-04-10 22:52:52

4

你有点无所适从短语“指定初始化”的意思。一个班级可能有几个初始者。我们来看一个虚构的猫类。这可能有以下初始化:

- init 
- initWithName: 
- initWithName:breed: 
- initWithName:breed:age: 

指定初始化是实际执行的是类的初始化并通过对super调用之一。最后一个,initWithName:breed: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]; 
} 

所以要改变一个子类的初始化行为,你只需要改变指定初始化,你会得到别人的自由。

+0

感谢Chuck给予的回复。我还有一个问题。当super初始化时,它是否创建了超类的对象,然后将其存储在自我中? – 2013-04-10 23:46:04

+0

@DanielLee:不。'super'是一个等同于'self'的关键字,但运行该方法的超类版本而不是当前类。所以它只是在'self'上运​​行超类初始化器来设置从超类继承的任何实例变量等。 – Chuck 2013-04-10 23:50:11

+0

谢谢查克。我知道我已经说过这是我的最后一个问题,但我认为在我完全理解init之前我需要澄清一件事。初始化方法的真正含义是什么?这是否意味着在分配类内存后,类对象被赋予“初始”(如初始化)值为零?而且,什么是自我?是自我的对象?你引用的实例变量是它们的实例变量,如* myFraction,它保存对数据的引用或存储在对象中的分子?对不起,有很多问题。 – 2013-04-11 00:02:06

相关问题