Ios 目标C在执行self=[super init]后self是否指向家长?

Ios 目标C在执行self=[super init]后self是否指向家长?,ios,objective-c,Ios,Objective C,当我有如下代码时: self = [super init] self指向super吗?如果是这样,你为什么想要这个?如果我的实例对象具有变量someVal,我将无法通过执行[self-someVal]来访问它。对吗 当self指向super时,如何使用self来访问实例变量 self指向super吗 这个问题在实例方法中没有意义,因为实际上没有指向实例的具体/实际指针,它只是指示必须调用超类的实现。由于在大多数对象(类簇除外)的情况下,所有方法都返回self;,那么答案是否定的:指向实例的实际

当我有如下代码时:

self = [super init]
self指向super吗?如果是这样,你为什么想要这个?如果我的实例对象具有变量someVal,我将无法通过执行[self-someVal]来访问它。对吗

当self指向super时,如何使用self来访问实例变量

self指向super吗

这个问题在实例方法中没有意义,因为实际上没有指向实例的具体/实际指针,它只是指示必须调用超类的实现。由于在大多数对象(类簇除外)的情况下,所有方法都返回self;,那么答案是否定的:指向实例的实际指针本身不会神奇地改变

请注意:这个异常是由大多数Cocoa容器类的类集群表现出来的,例如NSString、NSArray等。。这些类通常有一个初始值设定项方法,该方法返回的实例与最初分配的实例不同,并且该类是原始self类的一个具体子类。例如,NSString初始值设定项的实现可以是:

@implementation NSString

- (NSString *)init
{
    [self release];
    self = [[__NSCFString alloc] init];
    return self;
}

@end
这样做的原因是,可以通过这种方式实现对不同类型初始化的优化

self指向super吗

这个问题在实例方法中没有意义,因为实际上没有指向实例的具体/实际指针,它只是指示必须调用超类的实现。由于在大多数对象(类簇除外)的情况下,所有方法都返回self;,那么答案是否定的:指向实例的实际指针本身不会神奇地改变

请注意:这个异常是由大多数Cocoa容器类的类集群表现出来的,例如NSString、NSArray等。。这些类通常有一个初始值设定项方法,该方法返回的实例与最初分配的实例不同,并且该类是原始self类的一个具体子类。例如,NSString初始值设定项的实现可以是:

@implementation NSString

- (NSString *)init
{
    [self release];
    self = [[__NSCFString alloc] init];
    return self;
}

@end

这样做的原因是,可以通过这种方式对不同类型的初始化进行优化。

Self总是指向一个实例。当您使用super时,您引用的是父方法,而不是父实例。

Self始终指向一个实例。当您使用super时,您引用的是父方法,而不是父实例。

self表示当前类的实例

self=[super init]表示self正在获取[super init]返回的值。

self表示当前类的实例

self=[super init]表示self正在获取[super init]返回的值

self指向super吗

其实情况正好相反。super实际上与self相同,只是它告诉编译器开始寻找从超类而不是类本身开始的方法实现。您可以通过记录super和self的值来检查这一点;你会发现它们都指向同一个地址

创建对象时,可以执行以下操作:

Foo *f = [[Foo alloc] init];
alloc分配的内存将成为您正在创建的对象,但在该内存初始化之前,它只是一块内存,不是有效的对象。如果Foo是Bar的子类,Bar是NSObject的子类,那么按照惯例,Foo的初始值设定项将调用Bar的,Bar的将调用NSObject的,因此初始化按顺序进行:首先,内存由NSObjects'-init初始化,Bar的init接收返回值并将其分配给self。然后,它继续执行任何特定于条的初始化,并返回self。Foo的-init然后再次将返回值分配给self,最后执行任何特定于Foo的初始化

所有分配给自己的东西可能看起来既多余又混乱。这实际上只是一个约定,但其目的是允许超类的初始值设定项返回某些对象,而不是已分配的对象,包括nil。因此,例如,如果由于某种原因导致Bar初始化失败,[Bar init]可能返回nil。nil可能从[super init]返回,这就是我们将self=[super init]赋值放在条件中的原因:如果赋值为nil,则跳过初始化部分并返回nil。也可能-[Bar init]会返回指向分配对象以外的对象的指针,例如,当与正在创建的对象类似的对象已经存在并且可以重用时

大多数情况下,从-init返回的指针与从+alloc返回的指针相同,因此可以编写以下代码:

Foo *f = [Foo alloc];
[f init];
但是,如果您编写了这样一个函数,那么您将假设您的类的初始值设定项及其继承的所有类将始终返回同一个对象,并且永远不会返回nil。这样做你就打破了c 如果在将来的类发行版中返回不同的对象,就会破坏您的代码。而且,看起来你好像不知道自己在做什么

self指向super吗

其实情况正好相反。super实际上与self相同,只是它告诉编译器开始寻找从超类而不是类本身开始的方法实现。您可以通过记录super和self的值来检查这一点;你会发现它们都指向同一个地址

创建对象时,可以执行以下操作:

Foo *f = [[Foo alloc] init];
alloc分配的内存将成为您正在创建的对象,但在该内存初始化之前,它只是一块内存,不是有效的对象。如果Foo是Bar的子类,Bar是NSObject的子类,那么按照惯例,Foo的初始值设定项将调用Bar的,Bar的将调用NSObject的,因此初始化按顺序进行:首先,内存由NSObjects'-init初始化,Bar的init接收返回值并将其分配给self。然后,它继续执行任何特定于条的初始化,并返回self。Foo的-init然后再次将返回值分配给self,最后执行任何特定于Foo的初始化

所有分配给自己的东西可能看起来既多余又混乱。这实际上只是一个约定,但其目的是允许超类的初始值设定项返回某些对象,而不是已分配的对象,包括nil。因此,例如,如果由于某种原因导致Bar初始化失败,[Bar init]可能返回nil。nil可能从[super init]返回,这就是我们将self=[super init]赋值放在条件中的原因:如果赋值为nil,则跳过初始化部分并返回nil。也可能-[Bar init]会返回指向分配对象以外的对象的指针,例如,当与正在创建的对象类似的对象已经存在并且可以重用时

大多数情况下,从-init返回的指针与从+alloc返回的指针相同,因此可以编写以下代码:

Foo *f = [Foo alloc];
[f init];

但是,如果您编写了这样一个函数,那么您将假设您的类的初始值设定项及其继承的所有类将始终返回同一个对象,并且永远不会返回nil。这样做,你就违反了惯例,严重束缚了你自己和编写Foo继承的类的人——如果他们在类的未来版本中返回不同的对象,他们就会破坏你的代码。而且,看起来你不知道自己在做什么。

self是当前实例,而不是当前类。@bdesham:ooopss错过了某个东西。self是当前实例,而不是当前类。@bdesham:ooopss错过了某个东西。那么为什么要存储[super init]的返回值呢?如果从父级引用的self与从子级引用的self相同,则无需将[super init]的返回存储在self变量中。对吗?@user1099123除了类集群之外的大多数对象-所以是的,它是必需的。那么为什么要存储[super init]的返回呢?如果从父级引用的self与从子级引用的self相同,则无需将[super init]的返回存储在self变量中。对吗?@user1099123除了类集群之外的大多数对象-所以是的,它是必需的。