iOS重写父类中的方法时要先调用父类中的方法的原因

现有两个类:

1.Object001继承自NSObject

#import <Foundation/Foundation.h>
 
@interface Object001 : NSObject
 
//Object001的头文件,我只是在这里面声明了个方法
-(void)printfString;
 
@end
 
#import "Object001.h"
 
@implementation Object001
 
//Object001的实现文件,我实现了声明的printfString方法,这个方法的作用是在控制台上打印Object001字符串
-(void)printfString
{
    NSLog(@"Object001");
}
 
@end
2.Object002继承自Object001

#import "Object001.h"
 
@interface Object002 : Object001
//无修改
@end
 
#import "Object002.h"
 
@implementation Object002
 
-(void)printfString
{
//    [super printfString];  Object002的对象先不调用Object002父类中的方法
 
    NSLog(@"Object002");
}
 
@end

#import "ViewController.h"
#import "Object002.h"
 
@implementation ViewController
//ViewController 实现
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
 
    Object002 *object002 = [Object002 new];
    [object002 printfString];
}

控制台打印如下信息:

然后在Object002类中调用父类中的方法再运行一次,控制台打印如下信息:

对比一下就可以知道:在子类中重写父类中的方法,如果不调用父类中的方法,那么就不执行父类中的方法,就像重新写了个名字一样的方法把父类中的方法覆盖掉了一样。
举个例子:在下面两个非常常用的方法中,如果不用父类指针调用父类中的方法也能运行成功,只是这个对象少了一些行为而已,所以当重写父类中的方法时一定要先用父类指针(super)调用一下父类中的方法。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
 
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

时间: 2024-12-23 15:44:07

iOS重写父类中的方法时要先调用父类中的方法的原因的相关文章

Android中在WebView里实现Javascript调用Java类的方法_Android

为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制.只要调用addJavascriptInterface方法即可映射一个Java对象到JavaScript对象上. 1.映射Java对象到JavaScript对象上 复制代码 代码如下: mWebView = (WebView) findViewById(R.id.wv_content); mWebView.setVerticalScrollbarOverlay(tr

link中可以通过代码发射去调用let中定义的变量么?怎么实现?

问题描述 link中可以通过代码发射去调用let中定义的变量么?怎么实现? link中可以通过代码发射去调用let中定义的变量么?怎么实现? 解决方案 不可以,因为select以后,这些字段在select产生的匿名对象自动被提取出来了.

javascript中方法的链式调用(jQuery中的重要特性)

       方法的链式调用是jQuery最重要的特性,也是jQeury得以标榜的重要亮点,那么今天我们就来看看这个特性是如何实现的???        方法的链式调用只是一种语法招数(纸老虎哟,不要被吓到).         那我们就先来看看怎么来消化掉这个纸老虎.为了实现这中技术.我们首先         (1)创建一个取得HTML元素的对象的工厂(使用工厂模式创建,以后会有专门章节讲解).       (2)创建一批对这些HTML元素执行某些操作的方法.         仅仅需要这两个步骤

flex中使用RadioButtonGroup时取出所选项的值的方法

 flex中的RadioButtonGroup想必大家并不陌生吧,在本文将为大家介绍下在使用RadioButtonGroup时如何取出所选项的值,感兴趣的朋友可以参考下 代码如下: <mx:FormItem label="是否打印:">  <mx:HBox verticalAlign="middle" horizontalGap="15">  <mx:RadioButtonGroup id="dayinID

flex中使用RadioButtonGroup时取出所选项的值的方法_Flex

复制代码 代码如下: <mx:FormItem label="是否打印:"> <mx:HBox verticalAlign="middle" horizontalGap="15"> <mx:RadioButtonGroup id="dayinID" /> <mx:RadioButton label="不打印" id="noPrint" group

驱动精灵2015版本中更新显卡时出现蓝屏现象的解决方法

驱动更新或者安装,我们通常会选用驱动精灵.驱动精灵2015版本中,更新了显卡,却出现了蓝屏的现象,这是怎么回事?遇到该种情况,有什么方法进行解决? 首先我们来看看驱动精灵怎么更新显卡驱动? 第一步:打开我们的驱动精灵,点击一键检测. 驱动精灵 第二步:驱动精灵会检测出我们的电脑有哪些驱动故障,点击"修复". 驱动精灵 第三步:这个时候你会看到你的驱动出现了问题,在列表中请勾选显卡驱动,点击"下载". 驱动精灵 第四步:显卡驱动下载完成后,点击"安装&quo

如何防止覆盖(override)toString方法时产生递归调用

本文为原创,如需转载,请注明作者和出处,谢谢!     在Java中任何对象都继承于Object类,因此,每个类都有一个toString方法用于返回当前对象的字符串形式(可能是对象地址或其他和对象相关的信息).在每个类中也可以覆盖toString方法以返回自定义的字符串.如下面的代码将以一定的格式返回对象的地址: package string; public class InfiniteRecursion {     public String toString()     {         

Python中子类怎样调用父类方法

python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类,就要在这个函数里显式调用一下父类的__init__(),这跟C++,jAVA不一样,他们是自动调用父类初始化函数的. 调用父类函数有以下方法: class A: def method(self, arg): pass class B(A): def method(self, arg): # A.me

Python实现子类调用父类的方法_python

本文实例讲述了Python实现子类调用父类的方法.分享给大家供大家参考.具体实现方法如下: python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问,但是该方法或属性在子类中并不存在,那么就会自动的去其父类中进行查找. 继承父类后,就能调用父类方法和访问父类属性,而要完成整个集成过程,子类是需要调用的构造函数的. 子类不显式调用父类的构造方法,而父类构造函数初始化了一些属性,就会出现问题