- (id)init {
self = [super init];
if (self) {
// initialize instance variables here
}
return self;
}
阅读了Apple的文档后,我仍然对上述内容感到困惑。我熟悉其他语言中self
和this
的概念,但在这里我们将self
分配给超类init self = [super init];
,然后检查是否返回nil。但后来我们在最后一行回归自我。我的意思是,通常回归self
意味着"我回归自己"但是,由于我们之前已将self
分配给super init
,因此我们不会将super
作为self
而不是ourselves
作为self
返回?
编辑 - 我试图在上面尽可能清楚但在句子中使用self很棘手。希望有人可以提供帮助。
答案 0 :(得分:0)
self
与Java或C#中的this
相同。
该行
self = [super init];
允许父类首先进行初始化。如果一切都很好(换句话说,self != nil
)那么我们可以做任何我们需要做的初始化。
最后我们返回self
。
您必须记住,self
或ourselves
正如您所描述的那样,它由父类和此类完成的初始化组成。
<强>更新强>
此类和父类需要合作以初始化self
。我们需要通过调用[super init]
为父类提供第一个镜头。完成后,它返回一个我们称为self
的对象。然后,我们使用此子类定义的实例变量的值进一步初始化self
。但是两个初始化器都在处理同一个对象。
答案 1 :(得分:0)
没有!
每个初始化程序都必须调用[super init]
。这意味着您在示例中调用的超级初始化程序也是如此。
所有这些初始化程序都可以根据需要准备对象,以便最终准备好在类继承描述它时使用它。它们都在同一个对象上工作。 (这是OO的观点。一个对象可以完成其(超级)类所描述的所有内容。因此所有(超级)类都必须初始化该对象。)
self
只不过是指向方法/初始化程序当前正在处理的对象的指针。它没有像#34那样的特殊含义;我正在回归自己&#34;。
请注意,没有init
方法分配对象。这是通过[AClass alloc]
完成的。
答案 2 :(得分:0)
让我用外行的语言表达。
在研究面向对象编程时,你必须阅读有关汽车以及普锐斯如何成为Car
的对象的内容。
你基本上有一个超类Car
,所有汽车都会继承,如Prius,Focus等。对于Prius来说,汽车,面向对象的术语和继承,Prius必须先从Car
继承,然后添加Prius特定的属性/属性。
同样,您在Objective-C中创建的每个类(以及几乎所有面向对象的编程语言)都必须首先从父类继承。根类为NSObject
(objective-c)。
[super init]
初始化父类及其所有属性。在成功之后,您可以添加特定于您的类的属性/属性。
一个常见示例是当您对init
进行子类化时覆盖UITableViewCell
方法。
- (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
,并提供style
和reuseIdentifier
。您可以在此处访问UITableViewCell
的所有属性。此外,imageView将添加到单元格中,该单元格仅适用于此单元格。
Object Initialization
文件非常适合帮助理解这一点。