您的位置:首页 > 移动开发 > IOS开发

iOS 类继承时self和super调用方法的问题

2017-02-09 16:45 381 查看
如果想在一个方法中调用当前类的方法,可以使用self,如果调用当前类的父类的方法,可以使用super。如果在这些类中存在继承关系的时候,使用self和super调用方法的时候需要格外注意。我们通过如下的例子来分析。

一.使用self来调用方法

如下图,有三个类A,B,C。类A定义了方法1,2,3;类B继承自类A,重写了方法1,3;类C继承自类B,重写了方法2。



对类B的实例对象调用方法3时,首先会通过self调用方法1,这个方法1就是类B的方法1;
接着方法3通过self调用方法2,因为类B并没有定义方法2,所以调用从类A继承过来的方法2;
如果是类C的实例化对象调用方法3又会是怎么样呢?

因为类C并没有定义方法3,所以调用的是父类B的方法3;
接着,方法3通过self调用方法1,因为此时self指的是类C的实例对象,所以调用的是类C的方法1,又由于类C没有定义方法1;所以调用的父类B的方法1;
最后通过self调用方法2时,同上的self指的是类C的实例对象,所以调用的是类C的方法2。
通过上述的分析,只需要明确self在实际执行的时候指向的哪一个类的实例,这样在分析方法调用的时候,直接先调用自身实例的方法,自身实例的没有定义的时候,再到父类去调用。

二.使用super来调用方法
使用super调用父类的方法,与self调用相比,问题比较简单,直接就是调用父类的方法。
为什么使用self和super调用,会有不一样的差别呢,这主要就是因为self在实例方法中,self是一个实例变量,需要根据具体的实例化的类来确定自身的性质,而super不是实例对象,只是一个系统指代父类的关键字。
除此,在类方法和实例方法的self定义不同:

实例方法里面的self,是对象的首地址。
类方法里面的
self
,是
Class
.
三.例子验证

#import <Foundation/Foundation.h>
#import <stdio.h>
@interface A:NSObject
-(void)method1;
-(void)method2;
@end
//Class A
@implementation A
-(void)method1
{
NSLog(@"this is method 1 of class A.\n");
}
-(void)method2
{
NSLog(@"this is the method 2 of class A.\n");
}
@end
//Class B
@interface B:A
//overload method2
-(void)method2;
@end

@implementation B
-(void)method2
{
NSLog(@"this is the metnod 2 of class B");
NSLog(@"self--->");
[self method1];
NSLog(@"super--->");
[super method2];
}
@end
//Class C
@interface C : B
//overload method1
-(void)method1;
@end
@implementation C

-(void)method1
{
NSLog(@"this is the method 1 of class C.\n");
}

@end
int main(int argc, const char * argv[])
{
B *b=[[B alloc] init];
C *c=[[C alloc] init];
NSLog(@"---instance of B---");
//类B没有重写方法1,所以调用父类A的方法1
[b method1];
//类B重写了方法2,所以直接调用类B自身的方法2,重写的方法2的self调用父类A方法1,super调用方法父类的方法2
[b method2];
NSLog(@"---instance of C---");
//类C重写了方法1,所以调用类C自身的方法1,
[c method1];
//类C没有重写方法2,所以调用父类B的方法2,父类B的方法2里的self调用子类C的方法1,super方法调用类B的父类的方法2
[c method2];
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 继承 self super 调用
相关文章推荐