一、概述 在 iOS中可以直接調用 某個對象的消息 方式有2種 第一種方式是使用NSObject類提供的performSelector系列方法 還有一種方式就是使用NSInvocation進行動態運行時的消息分發,動態的執行方法,相信大家一定經常使用NSObject 類提供的performSelector系列方法,在這裡就不再對此進行描述了,今天主要是分享一下使用NSInvocation動態執行 方法。 二、NSInvocation的使用 1、執行類方法 demo代碼如下: [cpp] - (void)testClassMethod{ NSString *string = nil; //初始化NSMethodSignature對象 NSMethodSignature *sig = [NSString methodSignatureForSelector:@selector(stringWithString:)]; //初始化NSInvocation對象 NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; //設置執行目標對象 [invocation setTarget:[NSString class]]; //設置執行的selector [invocation setSelector:@selector(stringWithString:)]; //設置參數 NSString *argString = @"test method"; [invocation setArgument:&argString atIndex:2]; //執行方法 [invocation retainArguments]; [invocation invoke]; //獲取返回值 [invocation getReturnValue:&string]; NSLog(@"執行結果 ====%@",string); } 2、執行實例方法 demo示例代碼如下: [cpp] - (void)testInstanceMethod{ NSString *string = [NSString stringWithFormat:@"我是一個string"]; NSLog(@"1=%@",string); SEL subStringSel = @selector(substringFromIndex:); //初始化NSMethodSignature對象 NSMethodSignature *methodSignature = [[NSString class] instanceMethodSignatureForSelector:subStringSel]; //初始化NSInvocation對象 NSInvocation *myInvocation = [NSInvocation invocationWithMethodSignature:methodSignature]; //設置target [myInvocation setTarget:string]; //設置selector [myInvocation setSelector:subStringSel]; //設置參數 int arg1 = 2; [myInvocation setArgument:&arg1 atIndex:2];//參數從2開始,index 為0表示target,1為_cmd //獲取結果 www.2cto.com NSString *resultString = nil; [myInvocation invoke]; [myInvocation getReturnValue:&resultString]; NSLog(@"2=%@",resultString); }