isa方法列表測試(含Demo)

以下這個圖我們都很熟悉,但是理論總是生澀的,我用demo幫助大家理解一下:

目的:

一.測試父類子類中,函數 的關係

二.測試父類子類中,函數調用 的關係


Demo下載






一.測試父類子類中,函數 的關係

三個類:ParentObject : NSObjectAObject : ParentObjectBObject :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];

}


log:

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調用的方法,首先在子類中去查找;如果有則調用子類的;





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章