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来调用方法
如下图,有三个类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的使用调用父类构造方法
- iOS中的 self,super,copy等关键字问题
- iOS的常见问题---Object-C有私有方法吗?私有变量呢?多重继承?
- java的继承关系中,构造方法调用问题
- OC基础day4-继承,self,super,多态,类对象,SEL类型,description,私有方法与私有变量,三种访问限制
- [iOS] performSelector:withObject:afterDelay:调用没有作用的问题及解决方法
- Objective-C(三、类与继承,基类,self、super关键字,多态,组合)——iOS开发基础
- Java 继承 继承条件下的构造方法调用 super
- [iOS]为什么不要在init初始化方法里调用self.view
- [iOS]为什么不要在init初始化方法里调用self.view
- iOS里面消除使用代理调用方法时间警告问题
- [Java问题] 继承方法调用问题
- 理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题
- 关于子类继承父类后调用方法的问题
- iOS 消息(即方法调用)的两个隐藏参数 :self 和 _cmd
- OC视频笔记2.3(OC继承的使用)2.4(self与super)2.5(方法的重写)
- [iOS] performSelector:withObject:afterDelay:调用没有作用的问题及解决方法
- [iOS]为什么不要在init初始化方法里调用self.view
- 四.OC基础--1.文档安装和方法重载,2.self和super&static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&私有方法,6.description方法