iOS NSInvocation用法

在 iOS中可以直接調用 某個對象的消息 方式有兩種

一種是performSelector:withObject:

再一種就是NSInvocation

第一種方式比較簡單,能完成簡單的調用。但是對於>2個的參數或者有返回值的處理,那就需要做些額外工作才能搞定。那麼在這種情況下,我們就可以使用NSInvocation來進行這些相對複雜的*作

main.h

[html] view plaincopy
#import <Foundation/Foundation.h> 
#import "MyClass.h" 
 
int main (int argc, const char * argv[]) 

 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
 
    MyClass *myClass = [[MyClass alloc] init]; 
    NSString *myString = @"My string"; 
     
    //普通調用 
    NSString *normalInvokeString = [myClass appendMyString:myString]; 
    NSLog(@"The normal invoke string is: %@", normalInvokeString); 
     
    //NSInvocation調用 
    SEL mySelector = @selector(appendMyString:); 
    NSMethodSignature * sig = [[myClass class]  
                               instanceMethodSignatureForSelector: mySelector]; 
     
    NSInvocation * myInvocation = [NSInvocation invocationWithMethodSignature: sig]; 
    [myInvocation setTarget: myClass]; 
    [myInvocation setSelector: mySelector]; 
     
    [myInvocation setArgument: &myString atIndex: 2]; 
     
    NSString * result = nil;     
    [myInvocation retainArguments];     
    [myInvocation invoke]; 
    [myInvocation getReturnValue: &result]; 
    NSLog(@"The NSInvocation invoke string is: %@", result); 
 
    [myClass release]; 
     
    [pool drain]; 
    return 0; 
}

MyClass.h


[html] view plaincopy
#import <Foundation/Foundation.h> 
 
 
@inte***ce MyClass : NSObject { 
     

 
- (NSString *)appendMyString:(NSString *)string; 
 
@end

MyClass.m


[html] view plaincopy
#import "MyClass.h" 
 
 
@implementation MyClass 
 
- (id)init 

    self = [super init]; 
    if (self) { 
        // Initialization code here. 
    } 
     
    return self; 

 
- (NSString *)appendMyString:(NSString *)string 

    NSString *mString = [NSString stringWithFormat:@"%@ after append method", string]; 
     
    return mString; 

 
- (void)dealloc 

    [super dealloc]; 

 
@end 

      這裏說明一下[myInvocation setArgument: &myString atIndex: 2];爲什麼index從2開始 ,原因爲:0 1 兩個參數已經被target 和selector佔用

 

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