以下這個圖我們都很熟悉,但是理論總是生澀的,我用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調用的方法,首先在子類中去查找;如果有則調用子類的;