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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值