IOS调用私有函数

IOS 调用私有函数

我的使用场景是我开发两个静态库,其中一个库需要使用另一个库的时候,但是这些方法我又不想暴露出来给其他人使用

首先定义一个类

// .h 文件
typedef void (^FailedBlock)(NSString* errCode,NSString* errDesc);
typedef void(^SuccessBlock) (int);

@interface ClassB : NSObject

@end

这边可以将函数变量存到成员变量,作为异步调用使用

// .m 文件
#import "ClassB.h"

@implementation ClassB

- (void)function_1:(NSString *)str {
    NSLog(@"%@", str);
}

- (void)function_2:(NSData *)data Successed:(SuccessBlock)successCB Failed:(FailedBlock)failedCB {
    if (data)
        successCB(0);
    else {
        failedCB(@"FFFF", @"data is nil");
    }
}

@end

调用只有一个参数或者没有参数可以使用performSelector

[object performSelector:@selector(function_1:) withObject:@"test function_1"];

多个参数使用objc_msgSend,引用型变量都可使用“id”代替,不需要知道具体类型,比如下面NSData *可以使用id代替

#import <objc/runtime.h>
#import <objc/message.h>

((void (*)(id,SEL,NSData *,id,id))objc_msgSend)(object, @selector(function_2:Successed:Failed:), [[NSData alloc] init], ^(int code) {
        NSLog(@"success");
    }, ^(NSString* errCode,NSString* errDesc){
        NSLog(@"failed");
    });

如果不知道函数名称也使用一下方法获取

unsigned int count = 0;
//所有在.m文件显式实现的方法都会被找到
Method *mets = class_copyMethodList([object class], &count);
for(int i=0;i<count;i++){
    NSString *str = [NSString stringWithCString:method_getTypeEncoding(mets[i]) encoding:NSUTF8StringEncoding];
    SEL sel = method_getName(mets[i]);
    NSString *name = [NSString stringWithCString:sel_getName(sel) encoding:NSUTF8StringEncoding];
    NSLog(@"方法名:%@\n属性:%@",name,str);
}

猜你喜欢

转载自blog.csdn.net/xiong_7631/article/details/128611091