NSInvocation 学习

本文介绍了iOS中NSInvocation类的使用方法,对比performSelector:withObject,适用于参数多或有返回值的情况。通过实例演示如何创建NSInvocation对象并设置target、selector及参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NSInvocation是iOS消息传递跟方法调用的一个类

用处跟performSelector:withObject的作用一样,后者调用一些参数少的消息是比较简便的,对于参数大于2或者有返回值的消息比较麻烦,NSInvocation是不二之选。

NSInvocation的简单用法:

NSInvocation是通过类方法 invocationWithMethodSignature 来创建的,所以必须对方法名进行签名,用方法签名来创建NSInvocation对象;

创建一个Command Line Tool工程,来测试NSInvocation的简单使用

@interface NSInvocationTestClass : NSObject

- (NSString *)testString:(NSString *)string;

@end

@implementation NSInvocationTestClass

- (id)init {

    self = [super init];

    if (self) {        

    }

    return self;

}

- (NSString *)testString:(NSString *)string {

    NSString *aString = [NSString stringWithFormat:@"****%@***",string];

    return aString;

}

@end


int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // insert code here...

        NSInvocationTestClass *testClass = [[NSInvocationTestClass alloc] init];

        NSString *tString = @"Hello World!";

        //普通调用

        NSString *normalInvokeString = [testClass testString:tString];

        NSLog(@"normal invoke string is:%@",normalInvokeString);

        

        // 使用NSInvocation来调用

        SEL testSelector = @selector(testString:);

        // 方法签名

        NSMethodSignature *methodSig = [[testClass class] instanceMethodSignatureForSelector:testSelector];

        // 根据方法签名来创建一个NSInvocation

        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSig];

        // 设置target

        [invocation setTarget:testClass];

        // 设置selector

        [invocation setSelector:testSelector];

        // 设置Argument,为什么index是从2开始?因为0被 target,1被selector占用了

        [invocation setArgument:&tString atIndex:2];

        如果有多个参数, 

        [invocation setArgument:&***** atIndex:3];   


        NSString * result = nil;

        [invocation retainArguments];

        [invocation invoke];

        // 获取返回值

        [invocation getReturnValue: &result];

        NSLog(@"The NSInvocation invoke string is: %@", result);

    }

    return 0;

}

输出的结果是一样的:

NSInvocationDemo[25694:1262437] normal invoke string is:****Hello World!***

NSInvocationDemo[25694:1262437] The NSInvocation invoke string is: ****Hello World!***

这是NSInvocation 的简单用法,怎么接入到项目中,这就要看实际的需求了。

有兴趣更深入了解NSInvocation的朋友,可以去苹果官方文档查看资料。苹果官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值