2015-02-07 63 views
2
- (id)init { 
    self = [super init]; 

    if (self) { 
     // initialize instance variables here 
    } 

    return self; 
} 

读过苹果的文档后,我仍然被上面的困惑。我熟悉其他语言的selfthis的概念,但在此我们将self分配给超类init self = [super init];,然后检查是否返回nil。但是,我们在最后一行回归自我。我的意思是,通常返回self的意思是“我正在归还我自己”,但由于我们之前分配了selfsuper init,是不是我们将super归为self而不是ourselves归为self在objective-c init方法中返回什么“自我”?

编辑 - 我试图尽可能清楚以上,但在句子中使用自我是棘手。希望有人能帮忙。

回答

0

不!

每个初始化程序必须调用[super init]。这意味着您在示例中调用的超级初始化程序的功能相同。

所有这些初始化程序都可以根据需要准备对象,以便在类继承描述它时最终可以使用它。他们都在同一个对象上工作。 (这是OO的一个目标,一个对象可以完成其所有(超级)类所描述的任何事情,所以所有(超级)类都必须初始化该对象。)

self无非是一个指向对象的指针/目前正在研究。它没有像“我回归自己”这样的特殊含义。

请注意,没有init方法分配对象。这与[AClass alloc]完成。

+0

啊,我现在得到它。感谢idmean和micheal welch。因此,self是调用这些继承的inits的对象,即使inits属于父类,并且这些继承的inits将调用对象(需要初始化的子对象)称为self。得到它了! – 2015-02-07 20:31:44

0

self与Java或C#中的this相同。

线

self = [super init]; 

被允许父类做的初始化第一。如果一切都好(换句话说,self != nil),那么我们可以做任何我们需要做的初始化。

最后我们返回self

您必须记住,selfourselves正如您所描述的,它由父类和此类完成的初始化组成。

更新

这个类和父类需要进行合作,以初始化self。我们需要通过调用[super init]来给父母班级第一枪。完成后,它会返回一个我们称为self的对象。然后我们用这个子类定义的实例变量的值进一步初始化self。但是两个初始化器都在处理同一个对象。

+1

还分配和初始化,和类簇之间的差扎入这一点。 – Wain 2015-02-07 20:23:33

+0

我不明白的是,当父母回归自我时,他们会回归自我。但是当我们返回自我时,我们也返回父对象,因为我们在自我= [超级初始化]时将自己指定给父对象。没有? – 2015-02-07 20:24:32

+0

@是的,这是正确的。这张海报似乎很困惑,并认为父类正在创建一个对象,并且此类正在创建一个不同的对象,并且我们正在返回父对象而不是此对象。我主要是想指出,父init和这个init都在初始化同一个对象。 – 2015-02-07 20:25:39

0

让我把这个以外行人的语言。

在学习面向对象编程时,您一定已经阅读过有关Cars和一个Prius如何成为Car的对象。 你基本上有一个超Car使所有汽车继承,像普锐斯,福克斯等。对于普锐斯是一辆车,在面向对象的术语,继承,普锐斯必须首先从Car继承,然后添加普锐斯的具体属性/属性。

同样的方式,每次你在Objective-C(和几乎每一个面向对象的编程语言)使类,你必须首先从父类继承。根类是NSObject(objective-c)。

[super init]初始化父类,所有它的属性。在成功之后,您可以添加自己的属性/属性,这些属性是特定于您的课程的。

一个常见的例子是当您覆盖UITableViewCell的子类时覆盖init方法。

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 

    if (self) { 

     UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Foo"]]; 
     imageView.frame = CGRectMake(0, 0, 100, 50); 
     [self.contentView addSubview:imageView]; 
    } 

    return self; 
} 

这里,initWithStyle:reuseIdentifier:被覆盖。它首先调用[super initWithStyle:style reuseIdentifier:reuseIdentifier]。这会初始化一个默认的UITableViewCell,其中stylereuseIdentifier提供给它。您可以在此访问UITableViewCell的所有房产。另外,imageView被添加到单元格中,该单元格只针对该单元格。

Object Initialization文件是真的好,以帮助理解这一点。

相关问题