Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 理解';自我';把自己设定为超级_Objective C_Ios - Fatal编程技术网

Objective c 理解';自我';把自己设定为超级

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上发送

我一直在学习一些教程,我对self很失望。有人能帮忙吗

我有下面的init,它是一个实例方法

- (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
指向class
SomeClass
的对象

不过,这个作业看起来有点奇怪:

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
    指向相同的内存,但在解析时对其进行不同的处理。