創(chuàng)建一個(gè)OC項(xiàng)目,
創(chuàng)建項(xiàng)目
目錄結(jié)構(gòu)
對(duì)象方法調(diào)用源碼如下:
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#include <objc/message.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
Person *p = [[Person alloc]init];
[p run];
objc_msgSend(p, sel_registerName("run"));
}
return 0;
}
Person.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject
- (void) run;
@end
NS_ASSUME_NONNULL_END
Person.m
#import "Person.h"
@implementation Person
- (void)run{
NSLog(@"hellow its me");
}
@end
切記舌缤。一定關(guān)閉
關(guān)閉嚴(yán)格交驗(yàn)
項(xiàng)目跑起來
日志輸出
2019-08-15 23:43:25.320375+0800 RuntimeC[4896:98306] hellow its me
2019-08-15 23:43:25.320775+0800 RuntimeC[4896:98306] hellow its me
Program ended with exit code: 0
可以看到,objc_msgSend達(dá)到了調(diào)用方法的作用。
我們?cè)趍ain.m添加打印指針
NSLog(@"%p -- %p", sel_registerName("run"),@selector(run));
輸出如下:
2019-08-15 23:50:06.446510+0800 RuntimeC[5052:102860] 0x7fff4e7f3c7e -- 0x7fff4e7f3c7e
一摸一樣
類方法調(diào)用源碼如下:
Person.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject
- (void) run;
+ (void)walk;
@end
NS_ASSUME_NONNULL_END
Person.m:
#import "Person.h"
@implementation Person
- (void)run{
NSLog(@"hellow its me");
}
+ (void)walk{
NSLog(@"%s",__func__);
}
@end
main.m:
#import <Foundation/Foundation.h>
#import "Person.h"
#include <objc/message.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
objc_msgSend(objc_getClass("Person"), sel_registerName("walk"));
}
return 0;
}
日志輸出:
2019-08-20 01:23:22.873399+0800 RuntimeC[6287:175703] +[Person walk]
Program ended with exit code: 0