天天看點

runtime函數詳解

Class class = objc_allocateClassPair([NSObject class], "Cat", 0);
    class_addIvar(class, "name", sizeof(id), log2(sizeof(id)), @encode(id));
    class_addMethod(class, @selector(test), (IMP)&test, "v@:");//type必須跟實際類型相符v代表void @代表self :代表SEL
    objc_registerClassPair(class);
    
    id cat = [[class alloc] init];
    [cat setValue:@"hehe" forKey:@"name"];
    NSString *name = [cat valueForKey:@"name"];
    [cat performSelector:@selector(test)];

void test(id self, SEL _cmd) {
    NSLog(@"test------");
}
           

總結:

1.設定完類之後别忘了調用objc_registerClassPair(class)

2.從class_addMethod就可以看出imp就是函數指針,test是函數實作,加上&, &test就是函數指針了

3.定義函數時一定加上兩個預設變量id self, SEL _cmd,否則無效。

4.引入頭檔案

#import <objc/runtime.h>

#import <objc/message.h>

5.方法常用的字首,記住它然後看提示就行了

      objc_

      object_ 這個别露了

      ivar_

      method_

      sel_

      imp_

6.method的type

- (void)method1:(NSString *)name arg1:(int)age arg2:(NSString *)arg2;
           

用 method_getTypeEncoding 對應的是 [email protected]:[email protected]@28 

把其中的數字去掉就是 v@:@i@  

  v代表void 

  @代表id(self) 

  :代表SEL(_cmd)

  i代表int(age)

  @代表NSString*(arge2)

[email protected]:[email protected]@28

繼續閱讀