每一個類都有一個Class,獲取Class有以下三種方法。
// insert code here... //通過字符串獲取class Class clazz = NSClassFromString(@"NSString"); NSLog(@"clazz的類型是%@",clazz); //直接用calzz 來創建對象 id str = [[clazz alloc] init]; //通過對象來獲取class NSLog(@"%@",[str class]); //通過類來獲取class NSLog(@"%d",clazz==NSString.class); NSLog(@"Hello, World!");/**
對與第一種和第二種方式,都是根據類獲取Class對象,比較之下,第一種代碼安全性更高,程序再編譯階段就可以檢測所需要訪問的Class是否存在。性能更高,因為無需調用方法。
動態調用的方法如下。直接上代碼
#import@interface JQCar : NSObject @end
#import "JQCar.h" #import@implementation JQCar - (void)move:(NSNumber*)count{ int num = [count intValue]; for (int i=0; i 使用objc_msgSend可能報錯 //objc_msgSend()報錯Too many arguments to function call ,expected 0,have3
解決方法 //Build Setting--> Apple LLVM 6.0 - Preprocessing--> Enable Strict Checking of objc_msgSend Calls 改為 NO
#import#import #import "JQCar.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... //獲取JQCar類 Class clazz = NSClassFromString(@"JQCar"); //動態創建car id car = [[clazz alloc] init]; //使用performSelector方法來動態調用 [car performSelector:@selector(addSpeed:) withObject:[NSNumber numberWithLong:2]]; //使用Objec_send來動態調用 objc_send(car,@selector(addSpeed:),3.4); //定義函數指針變量 double (*addSpeed)(id ,SEL,double); //獲取car對象的addSpeed方法,再把addSpeed方法賦值給addSpeed指針變量 addSpeed = (double (*)(id,SEL,double))[car methodForSelector:NSSelectorFromString(@"addSpeed:")]; //調用addSpeed double speed = addSpeed(car, @selector(addSpeed:), 3.4); NSLog(@"加速後的速度是%g",speed); NSLog(@"Hello, World!"); } return 0; }