Ios 关于父对象';s初始方法

Ios 关于父对象';s初始方法,ios,Ios,Parent.h(扩展NSObject) 像这样: @implementation InTParent -(id)init { NSLog(@"Parent init method"); if (self = [super init]) { ; } return self; } -(id)initWithName:(NSString*)name; { NSLog(@"Parent initWithName method");

Parent.h(扩展NSObject) 像这样:

@implementation InTParent

-(id)init
{
    NSLog(@"Parent init method");
    if (self = [super init]) {
        ;
    }
    return self;
}


-(id)initWithName:(NSString*)name;
{
    NSLog(@"Parent initWithName method");
    if (self = [self init]) {
        ;
    } 
    return self;
}
@implementation InTSon

-(id)init
{
    NSLog(@"Son init method");
    if (self = [super init]) {
        ;
    }
    return self;
}

-(id)initWithName:(NSString*)name;
{
    NSLog(@"Son initWithName method");
    if (self = [super initWithName:name]) {
        ;
    }
    return self;
}
// -[InTSon initWithName:]
- (id)initWithName:(NSString *)name {
    return [super initWithName:name];
}
// -[InTParent initWithName:]
- (id)initWithName:(NSString *)name {
    return [self init];
}
// -[InTSon init]
- (id)init {
    return [super initWithName:@"sdas"];
}
- (id)initWithName:(NSString *)name {
    // init is NSObject's designated initializer, and we send it to super.
    if ((self = [super init])) {
        // your initialization code here
    }
    return self;
}
子h(扩展父级) 像这样:

@implementation InTParent

-(id)init
{
    NSLog(@"Parent init method");
    if (self = [super init]) {
        ;
    }
    return self;
}


-(id)initWithName:(NSString*)name;
{
    NSLog(@"Parent initWithName method");
    if (self = [self init]) {
        ;
    } 
    return self;
}
@implementation InTSon

-(id)init
{
    NSLog(@"Son init method");
    if (self = [super init]) {
        ;
    }
    return self;
}

-(id)initWithName:(NSString*)name;
{
    NSLog(@"Son initWithName method");
    if (self = [super initWithName:name]) {
        ;
    }
    return self;
}
// -[InTSon initWithName:]
- (id)initWithName:(NSString *)name {
    return [super initWithName:name];
}
// -[InTParent initWithName:]
- (id)initWithName:(NSString *)name {
    return [self init];
}
// -[InTSon init]
- (id)init {
    return [super initWithName:@"sdas"];
}
- (id)initWithName:(NSString *)name {
    // init is NSObject's designated initializer, and we send it to super.
    if ((self = [super init])) {
        // your initialization code here
    }
    return self;
}
我使用这个:
IntSon*\u-son=[[IntSon-alloc]initWithName:@“asd”]

为什么输出是: 子initWithName方法-->父initWithName方法-->子init方法-->父init方法

但在Java中,它可能是这样的: 子initWithName方法-->父initWithName方法-->父init方法


请帮帮我

因为“self”是一个“InTSon”,所以[self init]调用“InTSon”init方法。

因为“self”是一个“InTSon”,所以[self init]调用“InTSon”init方法。

要理解这种行为,您必须了解Objective-C消息调度是如何工作的。这是一个很好的例子来说明这一点

在较高的级别上,每当您对任何对象调用方法时,Objective-C运行时都会查找派生最多(类层次结构中最深的)类提供的实现。如果它找不到它,它将转到下一个最派生的对象,依此类推,一直到
NSObject
。第一次找到与选择器匹配的实现时(大致为方法名),它将执行该实现。调用
super
时,指定向该方法的下一个最派生类的实现发送消息

因此,在代码中,在
InTSon
类上调用
alloc
,该类返回
InTSon
的实例,其中
isa
指针设置为类对象
InTSon
isa
指针是在提升类层次结构的过程中如何查找方法实现的

因此,在您拥有一个
InTSon
实例之后,您在其上调用
initWithName:
,它检查
isa
指向的类(即
InTSon
)以获取此方法的实现。它找到它,然后执行它,从而产生第一个输出:

“Son initWithName方法”

紧接着,调用该方法的超类实现,它在
InTParent
中查找其
initWithName:
的实现,并执行该代码,产生第二个输出:

Parent initWithName方法

现在您看到了与Java的一个偏差-您在
self
self
上调用
init
,但是,它是指向
InTSon
实例的指针。因此,当运行时解析此消息时,它首先在
InTSon
类中查找
init
的实现。当然,它会找到它,然后执行调用该方法的代码,这将为您提供第三个输出,
soninitmethod
。接下来调用super,它将查找并执行
init
InTParent
实现,并为您提供最终输出


总之,无论方法在类层次结构中从何处调用,如果在
self
上调用,它将始终执行该方法的最派生的实现。希望这有帮助,如果您有任何问题,请告诉我!

要理解此行为,您必须理解Objective-C消息调度是如何工作的。这是一个很好的例子来说明它

在高层,每当您对任何对象调用一个方法时,Objective-C运行时都会查找派生最多(类层次结构中最深)的实现如果找不到它,它将转到下一个派生最多的类,依此类推直到
NSObject
。第一次找到与选择器匹配的实现(方法名称,大致),它将执行该实现。当您调用
super
时,您指定向该方法的下一个派生类实现发送消息

因此,在代码中,您在
InTSon
类上调用
alloc
,该类返回
InTSon
的一个实例,其中
isa
指针设置为类对象
InTSon
isa
指针是在提升类层次结构的过程中如何查找方法实现的

因此,在您拥有一个
InTSon
实例之后,您在其上调用
initWithName:
,它检查
isa
指向的类(即
InTSon
)以获取此方法的实现。它找到它,然后执行它,从而产生第一个输出:

“Son initWithName方法”

紧接着,调用该方法的超类实现,它在
InTParent
中查找其
initWithName:
的实现,并执行该代码,产生第二个输出:

Parent initWithName方法

现在您看到了与Java的一个偏差-您在
self
self
上调用
init
,但是,它是指向
InTSon
实例的指针。因此,当运行时解析此消息时,它首先在
InTSon
类中查找
init
的实现。当然,它会找到它,然后执行调用该方法的代码,这将为您提供第三个输出,
soninitmethod
。接下来调用super,它将查找并执行
init
InTParent
实现,并为您提供最终输出


总之,无论方法在类层次结构中从何处调用,如果在
self
上调用,它将始终执行该方法最派生的实现。希望这有帮助,如果您有任何问题,请告诉我!

您的类图如下所示:

@implementation InTParent

-(id)init
{
    NSLog(@"Parent init method");
    if (self = [super init]) {
        ;
    }
    return self;
}


-(id)initWithName:(NSString*)name;
{
    NSLog(@"Parent initWithName method");
    if (self = [self init]) {
        ;
    } 
    return self;
}
@implementation InTSon

-(id)init
{
    NSLog(@"Son init method");
    if (self = [super init]) {
        ;
    }
    return self;
}

-(id)initWithName:(NSString*)name;
{
    NSLog(@"Son initWithName method");
    if (self = [super initWithName:name]) {
        ;
    }
    return self;
}
// -[InTSon initWithName:]
- (id)initWithName:(NSString *)name {
    return [super initWithName:name];
}
// -[InTParent initWithName:]
- (id)initWithName:(NSString *)name {
    return [self init];
}
// -[InTSon init]
- (id)init {
    return [super initWithName:@"sdas"];
}
- (id)initWithName:(NSString *)name {
    // init is NSObject's designated initializer, and we send it to super.
    if ((self = [super init])) {
        // your initialization code here
    }
    return self;
}

当您将
initWithName:
消息发送到
InTSon
的实例时,系统会在
InTSon
的方法表中查找该方法,并找到我们称之为
-[InTSon initWithNam]的方法