以下这个图我们都很熟悉,但是理论总是生涩的,我用demo帮助大家理解一下:
目的:
一.测试父类子类中,函数 的关系
二.测试父类子类中,函数调用 的关系
一.测试父类子类中,函数 的关系
三个类:ParentObject : NSObject;AObject : ParentObject;BObject :AObject
@interface ParentObject : NSObject
- (void)printObj;
@end
#import "ParentObject.h"
@implementation ParentObject
- (void)printObj{
NSLog(@"ParentObject--%s",__FUNCTION__);
}
@end
@interface AObject :ParentObject
@end
#import "AObject.h"
@implementation AObject
@end
#import "AObject.h"
@interface BObject : AObject
@end
#import "BObject.h"
@implementation BObject
- (void)printObj{
[superprintObj];
NSLog(@"BObject--%s",__FUNCTION__);
}
@end
- (void)method:(id)obj{
Class currentClass=[obj class];
while (currentClass) {
unsignedint methodCount;
Method *methodList =class_copyMethodList(currentClass, &methodCount);
unsignedint i =0;
for (; i < methodCount; i++) {
NSLog(@"%@ ========== %@", [NSStringstringWithCString:class_getName(currentClass)encoding:NSUTF8StringEncoding], [NSStringstringWithCString:sel_getName(method_getName(methodList[i]))encoding:NSUTF8StringEncoding]);
}
free(methodList);
currentClass = class_getSuperclass(currentClass);
if ([[NSStringstringWithFormat:@"%@",currentClass]isEqualToString:@"NSObject"]) {
currentClass = nil;
}
}
}
#pragma mark - viewDidLoad
- (void)testMethod{
[selftestPObj];
NSLog(@" ==============1================ ");
[selftestAObj];
NSLog(@" ==============2================ ");
[selftestBObj];
}
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self testMethod];
}
log:
2016-08-25 16:57:58.110 SubObjectDemo[84610:17663247] ParentObject =====方法===== printObj
2016-08-25 16:57:58.110 SubObjectDemo[84610:17663247] ==============1================
2016-08-25 16:57:58.110 SubObjectDemo[84610:17663247] ParentObject =====方法===== printObj
2016-08-25 16:57:58.111 SubObjectDemo[84610:17663247] ==============2================
2016-08-25 16:57:58.111 SubObjectDemo[84610:17663247] BObject =====方法===== printObj
2016-08-25 16:57:58.111 SubObjectDemo[84610:17663247] ParentObject =====方法===== printObj
说明:向上查找的关系
ParentObject中有printObj这个方法;然而,AObject的方法列表中,没有printObj这个方法;
A之所以可以调用这个方法,一定不是因为自己本身有这个方法;是因为,根据isa找自己的方法没有找到,故调用自己的父类的;
二.测试父类子类中,函数调用 的关系
三个类:MethodObject : NSObject; MAObject :MethodObject;MBObject :MAObject
#import <Foundation/Foundation.h>
@interface MethodObject : NSObject
@end
#import "MethodObject.h"
@implementation MethodObject
@end
#import "MethodObject.h"
@interface MAObject : MethodObject
- (void)testOrder;
@end
#import "MAObject.h"
@implementation MAObject
- (void)testOrder{
NSLog(@"AObject1--%s",__FUNCTION__);
[selftestOrder2];//重点1
}
- (void)testOrder2{//重点2
NSLog(@"AObject2--%s",__FUNCTION__);
}
@end
#import "MAObject.h"
@interface MBObject : MAObject
@end
#import "MBObject.h"
@implementation MBObject
- (void)testOrder{
NSLog(@"BObject1-开始-%s",__FUNCTION__);
[supertestOrder];
NSLog(@"BObject1-结束-%s",__FUNCTION__);
}
- (void)testOrder2{//重点3
NSLog(@"BObject2--%s",__FUNCTION__);
}
@end
#pragma mark - testSubMethod
- (void)testSubMethod{
MBObject *p = [[MBObjectalloc]init];
[p testOrder];
}
2016-08-25 17:05:05.946 SubObjectDemo[84809:17676692] BObject1-开始--[MBObject testOrder]
2016-08-25 17:05:05.947 SubObjectDemo[84809:17676692] AObject1---[MAObject testOrder]////重点1
2016-08-25 17:05:05.947 SubObjectDemo[84809:17676692] BObject2---[MBObject testOrder2]////重点3
2016-08-25 17:05:05.947 SubObjectDemo[84809:17676692] BObject1-结束--[MBObject testOrder]
请大家注意,本例第二行与第三行中调用的是重点1和重点3;没有调用与重点1在同一个类中的重点2!
这是一种特殊情况:SuperClass调用的方法,首先在子类中去查找;如果有则调用子类的;