@interface Test : NSObject
-(void)testFunc;
@property(assign) int tag;
@end
@implementation Test
-(void)testFunc{
self.tag = 10;
NSLog(@"当前self内存 %p",&self);
}
@end
//定义类对象,存储在0x1区
id globalTest = [Test class];
//定义栈指针,指向类对象
void *pr = &globalTest;
// 这里的调用肯定是成功的
[(__bridge id)pr testFunc];
这种调用的好处是效率高,没有通过实例的 isa 去寻找类对象,而是直接通过类对象调用了方法 提高了方法的调用效率。
如果想提高方法调用效率,其实也可以通过内联(inline)的方式提高调用效率;
值得注意的是,内存平移的方式,另外一个相对于alloc 的好处是:栈内存分配比堆内存分配更快
WX20200618-105541@2x.png题外话:栈的分配是连续的,而且相对于线程是独立的,不需要加锁,而堆的分配,需要先找到一块空闲内存区,再加锁,进行分配,额外浪费了很多性能
(lldb) p globalTest
(id) $3 = 0x00000001029ff708
(lldb) p pr
(Test *) $4 = 0x00007ffeed204468
(lldb) x/16xg 0x00007ffeed204468
0x7ffeed204468: 0x00000001029ff708 0x000000000000000a
0x7ffeed204478: 0x00007ff32e904480 0x00007fff52387421
0x7ffeed204488: 0x0000600000dcdbc0 0x00007ffeed2044e0
0x7ffeed204498: 0x00007fff48c82698 0x0000000000000000
0x7ffeed2044a8: 0x0000000000000000 0x0000000000000001
0x7ffeed2044b8: 0x0000000090800c00 0x0000000000000001
0x7ffeed2044c8: 0x0000000050ba4401 0x0000000000000001
0x7ffeed2044d8: 0x0000000000000010 0x00007ffeed204810
想出内存平移的人,我想他的目的也是为了提高方法调用效率,那么提高方法调用效率,如果是swift语言,可以采用struct 或者extension 的方式,因为这两种方式都是直接派发方法,而不是oc那样消息机制,更不像class那样采用 witness table的方式来调用。效率很高
网友评论