![]() |
1
46
你是说为什么
两个原因:
针对迈克尔的评论编辑:
赛尔夫显然必须指向正确的记忆块,即你要返回的那块。
那可能是个问题。如果我将NSNumber子类化,[super init]决定返回一个NSString(它可以-没有什么可以阻止它),那显然是一场灾难。无论从-init返回什么,都必须与子类“兼容”,即为ivar提供空间并进一步子化,否则这是一个可怕的bug(当然,除非问题被记录在案)。所以,一般来说,你不需要担心检查类。但是,一定要阅读文档。例如,请参阅NSString文档中有关NSString子类化的部分。 |
![]() |
2
26
Matt Gallagher: What does it mean when you assign [super init] to self? 编辑: 根据评论,以下是链接中的要点
去理解为什么
是什么
每个方法都有两个隐藏参数:
由编译器更改为如下函数调用
实际情况是编译器使用
假设我们有一个方法
将由编译器转换成如下函数
做
下面是一个典型的对象创建和初始化示例。
把任务分配给
我们想要从
到
在下列情况之一
在最后一种情况下,如果返回的对象发生更改,则继续初始化它是一个错误,返回的对象已经完全初始化,不再需要与类相关。因此,更好的初始化方法如下
你不需要指定
为什么我们要继续分配给
|
![]() |
3
4
基本上每个Objective-C类都是一个子类。它要么是您指定的某个类,要么是NSObject。 在您调用的子类(您正在处理的类)中
现在为 如果(自身) 这基本上检查上述代码是否有效。
|
![]() |
4
1
在大多数情况下,将self设置为[super init]没有任何作用,因为[super init]无论如何都会返回self。不过,在一些罕见的情况下,[super init]会返回一些不同的结果。如果由于某种原因未能初始化超类,它可能返回nil,或者它可能决定返回一个完全不同的对象。 |
![]() |
5
1
Implementing The Designated Initializer ** 自己** 在方法中,self是一个隐式局部变量。不需要声明它,它会自动设置为指向发送消息的对象(在Android编程中是这样的。)通常,self用于对象向自身发送消息。示例如下:
超级的当我们重写一个方法时,我们希望保持超类的方法在做什么,并让您的子类在上面添加新的内容。为了更简单,Objective-C中有一个名为super的编译器指令。 通常,当您向对象发送消息时,该名称的方法的搜索从对象的类开始。如果没有这样的方法,则在对象的超类中继续搜索。在找到合适的方法之前,将继续向上搜索继承层次结构(如果它到达层次结构的顶部,但找不到任何方法,则会引发异常)。 |
![]() |
6
0
因为您必须以某种方式初始化对象,并且假定您要执行任何需要执行的超类初始化,因为您是从它开始下降的。 |
![]() |
Martin sku · 在目标C中打印时间 3 年前 |
![]() |
Vinod prajapat · 如何更新数组的最后一个元素? 3 年前 |
![]() |
subin272 · 修复iOS中的多个按钮单击事件? 7 年前 |
![]() |
James Chan · 如何使用锁定/解锁? 7 年前 |
![]() |
Josh F. · NSBundle mainBundle返回零 7 年前 |