Ios 关于父对象';s初始方法
Parent.h(扩展NSObject) 像这样: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");
@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]的方法