Objective c 理解';自我';把自己设定为超级
我一直在学习一些教程,我对self很失望。有人能帮忙吗 我有下面的init,它是一个实例方法Objective c 理解';自我';把自己设定为超级,objective-c,ios,Objective C,Ios,我一直在学习一些教程,我对self很失望。有人能帮忙吗 我有下面的init,它是一个实例方法 - (id) initWithScore:(int) s { self = [super init]; if (self) { score = s; } return self; } 现在通读代码时,我将self设置为super init,因此self现在指向super。然后我检查self是否有效,并将分数设置为我在InitWIthScore上发送
- (id) initWithScore:(int) s {
self = [super init];
if (self) {
score = s;
}
return self;
}
现在通读代码时,我将self设置为super init,因此self现在指向super。然后我检查self是否有效,并将分数设置为我在InitWIthScore上发送的值。到目前为止我已经做到了
但是现在我返回指向super的self,那么我如何返回我的子类呢
因此,假设有人通过100调用我的类,我的代码返回的是super而不是类,那么它是如何工作的呢?调用代码的分值如何为100
当然,它确实有效,但我不知道为什么:-(整个对象创建调用看起来有点像这样:
SomeClass *foo = [[SomeClass alloc] initWithScore:100];
现在发生的第一件事是调用[SomeClass alloc]
。这将为内存中的SomeClass
创建一个结构,并返回指向它的指针。接下来是初始化内容,其中self
是上一步的指针。因此self
指向classSomeClass
的对象
不过,这个作业看起来有点奇怪:
self = [super init];
在大多数情况下,[super init]
不会更改self
,它只会返回由[SomeClass alloc]
创建的指针。但是赋值模式允许两个额外选项:
init
可以通过返回nil
来发出构造错误的信号,在这种情况下,下面的所有初始化器都退出,您将得到一个nil
对象self
指针,例如,如果正在进行一些复杂的缓存。指针应该再次指向SomeClass
类型的对象,以便代码正常工作(您可以访问score
等)我建议您阅读Mike Ash的著作。是的,很好地认识到,
self
和super
都指向同一个对象,正如driis所指出的。这个结构允许初始值设定项(包括super
初始值设定项和您正在编写的初始值设定项)如果对象无法初始化,则返回nil
。这也是调用super
后在init
中检查nil
的原因
self
和super
都指向内存中相同的数据结构,即您分配的对象。区别在于这些特殊指针的语言语义:
当使用self
时,Objective-C编译器将以当前类型启动方法和重载解析
使用super
时,Objective-C编译器将在类的直接超类型处启动方法和重载解析。换句话说,super
只是能够在超类中调用方法的语义,即使当前类中存在相同的方法
换句话说(稍微简化),super
将内存位置视为super类的实例(例如,子类化的类型,通常为NSObject
),而self
将内存位置视为指向已定义类型的常规指针
如果你在调试器中打印
super
和self
,你会看到它们指向同一个内存位置。我想他想知道他为什么这样做。原因是[super init]
允许返回不同的指针,例如,如果无法初始化自身,则返回nil
。嗨,zoul,是的,我已经创建了对象,我明白我不明白的是(请参阅上面讨论的代码片段)在initiWithScore中,self被分配给[super init]现在它有了super,并将这个super返回给调用客户机,那么调用客户机(您的代码)在返回super时是如何包含“SomeClass”的内容的。太好了!这就是我一直在寻找的…所以我的self:-)这很好,但我也有super?我以为super会是超类?i、 e.NSObject?so self=[super init];现在self等于我的NSObject超类,或者它等于我,但这就是我困惑的地方,来自.net/java背景。如果我调用我的super类并进行初始化,那么super实际上不是nsobjectit@Martin,我更新了一点答案,希望能澄清。如果您有一个继承了NSObject
的类Foo
,那么Foo
也是一个NSObject
-is-a关系self
和super
指向相同的内存,但在解析时对其进行不同的处理。