能力值:
( LV2,RANK:10 )
2 楼
楼主赞~~
能力值:
( LV12,RANK:760 )
3 楼
楼主大赞~
能力值:
( LV13,RANK:290 )
4 楼
// 现在搞清楚,更新下
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[CMyClass testClassFun ]; // +号函数
// 后面都是-号函数
CMyClass *pTest = [[CMyClass alloc] init1];
[pTest Hello:4];
[pTest World:"Test" Num:5];
}
(lldb) memory read -s4 -fx -c16 0x1668b600 // 0x1668b600为实例类指针 pTest
0x1668b600: 0x00097760 0x00000001 0x00000002 0x6c6c6568
0x1668b610: 0x0000006f 0x00000000 0x00000000 0x00000000
0x1668b620: 0x3348bd3c 0x3aecba4d 0x3348b284 0x3058e665
0x1668b630: 0x00000000 0x00000000 0x00000000 0x00000000
(lldb) memory read -s4 -fx -c16 0x00097760 // 0x00097760为isa指针
0x00097760: 0x0009774c 0x3d3d1050 0x1659c110 0x00010003 // 0x1659c110为实例类的函数结构体数组
0x00097770: 0x1659b3a0 0x00097788 0x3bb0a1e4 0x16c08200
0x00097780: 0x000e007f 0x16599490 0x3d3d1064 0x3bb0a1d0
0x00097790: 0x1659a760 0x00030007 0x16599330 0x3d3d1064
(lldb) memory read -s4 -fx -c16 0x0009774c // 基类指针
0x0009774c: 0x3d3d1064 0x3d3d1064 0x1668bd80 0x00020003 // 0x1668bd80为基类的函数结构体数组
0x0009775c: 0x1659b290 0x0009774c 0x3d3d1050 0x1659c110
0x0009776c: 0x00010003 0x1659b3a0 0x00097788 0x3bb0a1e4
0x0009777c: 0x16c08200 0x000e007f 0x16599490 0x3d3d1064
(lldb) memory read -s4 -fx -c16 0x1668bd80 // 基类的函数结构体数组
0x1668bd80: 0x00000000 0x00000000 0x000960dd 0x00095b49 // 0x000960dd为函数名
0x1668bd90: 0x00000000 0x00000000 0x3348b603 0x3aecba95
0x1668bda0: 0x00000001 0x1668bd78 0x00000000 0x00000000
0x1668bdb0: 0x90000000 0x90000000 0x73730007 0x286e7546
(lldb) memory read -s4 -fx -c16 0x1659c110 // 实例类的函数结构体数组
0x1659c110: 0x00000000 0x00000000 0x00000000 0x00000000
0x1659c120: 0x000960ea 0x00095a5d 0x00000000 0x00000000 // 0x000960ea为函数名
0x1659c130: 0x00000001 0x1659c108 0x00000000 0x00000000
0x1659c140: 0x1659bfb0 0x00000000 0x1659bad0 0x00000000
(lldb) memory read 0x000960dd
0x000960dd: 74 65 73 74 43 6c 61 73 73 46 75 6e 00 69 6e 69 testClassFun.ini
0x000960ed: 74 31 00 48 65 6c 6c 6f 3a 00 57 6f 72 6c 64 3a t1.Hello:.World:
(lldb) memory read 0x000960ea
0x000960ea: 69 6e 69 74 31 00 48 65 6c 6c 6f 3a 00 57 6f 72 init1.Hello:.Wor
0x000960fa: 6c 64 3a 4e 75 6d 3a 00 6d 5f 6e 4c 65 6e 00 6d ld:Num:.m_nLen.m
能力值:
( LV13,RANK:290 )
5 楼
(lldb) memory read -s4 -fx -c16 0x1668bd80 // 基类的函数结构体数组
0x1668bd80: 0x00000000 0x00000000 0x000960dd 0x00095b49 // 0x000960dd为函数名
0x1668bd90: 0x00000000 0x00000000 0x3348b603 0x3aecba95
0x1668bda0: 0x00000001 0x1668bd78 0x00000000 0x00000000
0x1668bdb0: 0x90000000 0x90000000 0x73730007 0x286e7546
(lldb) memory read -s4 -fx -c16 0x1659c110 // 实例类的函数结构体数组
0x1659c110: 0x00000000 0x00000000 0x00000000 0x00000000
0x1659c120: 0x000960ea 0x00095a5d 0x00000000 0x00000000 // 0x000960ea为函数名
0x1659c130: 0x00000001 0x1659c108 0x00000000 0x00000000
0x1659c140: 0x1659bfb0 0x00000000 0x1659bad0 0x00000000
可以看见,基类和实例类的函数结构体数组位置不一样哦。
能力值:
( LV13,RANK:290 )
6 楼
在oc里,+号函数和-号函数的区别:
-(void)是实例方法,只有定义了这个类的实例,才能用实例调用这个方法。
+(void)是类方法,用类名可以直接调用这个方法。
通过分析,+号函数是基类调用的,-号函数是实例类调用的。其函数结构体数组的位置也不一样。
能力值:
( LV8,RANK:130 )
7 楼
收益了。。。
能力值:
( LV2,RANK:10 )
8 楼
能力值:
( LV13,RANK:540 )
9 楼
其实就是弄清楚objective-c runtime机制就可以了,Object-C 是通过 Dynamic Binding (动态绑定) 机制来实现消息传递的,对象对于详细的响应和处理都是在 runtime 运行时才能决定350K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2S2M7s2m8D9k6g2)9J5k6h3y4G2L8g2)9J5c8X3I4A6j5Y4u0S2M7Y4W2Q4x3V1k6E0j5h3y4Q4x3V1k6V1L8$3y4#2L8h3g2F1N6r3q4@1K9h3!0F1i4K6u0r3b7$3!0U0L8$3q4Q4x3V1k6d9k6h3k6W2M7X3g2F1j5$3g2Q4x3V1k6a6j5X3A6o6f1Y4g2F1N6r3W2E0k6g2u0W2k6W2)9J5c8W2u0W2k6X3g2J5k6h3&6U0k6g2)9J5c8Y4u0W2k6X3g2J5k6h3&6U0k6g2)9J5k6h3S2@1L8h3H3`.
357K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2B7L8$3u0T1L8$3I4W2i4K6u0W2j5$3!0E0i4K6u0r3y4K6V1#2y4o6g2Q4x3V1j5`.
能力值:
( LV13,RANK:290 )
10 楼
感谢楼上2位
能力值:
( LV13,RANK:290 )
11 楼
在objc-msg-arm.s中找到源码,真是一模一样啊。哈哈哈
.macro CacheLookup
ldrh r12, [r9, #CACHE_MASK] // r12 = mask
ldr r9, [r9, #CACHE] // r9 = buckets
.if $0 == STRET || $0 == SUPER_STRET
and r12, r12, r2 // r12 = index = SEL & mask
.else
and r12, r12, r1 // r12 = index = SEL & mask
.endif
add r9, r9, r12, LSL #3 // r9 = bucket = buckets+index*8
ldr r12, [r9] // r12 = bucket->sel
2:
.if $0 == STRET || $0 == SUPER_STRET
teq r12, r2
.else
teq r12, r1
.endif
bne 1f
CacheHit $0
1:
cmp r12, #1
blo LCacheMiss_f // if (bucket->sel == 0) cache miss
it eq // if (bucket->sel == 1) cache wrap
ldreq r9, [r9, #4] // bucket->imp is before first bucket
ldr r12, [r9, #8]! // r12 = (++bucket)->sel
b 2b
.endmacro
/********************************************************************
*
* id objc_msgSend(id self, SEL _cmd,...);
*
********************************************************************/
ENTRY objc_msgSend
MESSENGER_START
cbz r0, LNilReceiver_f
ldr r9, [r0] // r9 = self->isa
CacheLookup NORMAL
// calls IMP or LCacheMiss
LCacheMiss:
MESSENGER_END_SLOW
ldr r9, [r0, #ISA] // class = receiver->isa
b __objc_msgSend_uncached
LNilReceiver:
mov r1, #0
MESSENGER_END_NIL
bx lr
LMsgSendExit:
END_ENTRY objc_msgSend
能力值:
( LV8,RANK:130 )
12 楼
以前破解一个mac系统上的软件的时候遇到objc_msgSend ,当时没有找到任何中文资料。最后Google到国外一个博客中有讲解objc_msgSend 。
能力值:
( LV8,RANK:130 )
13 楼
总算找到了,一共4篇文章。
d62K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3k6J5K9h3c8S2P5g2)9J5k6h3y4G2L8g2)9J5c8X3u0T1N6h3#2Q4x3V1j5J5x3o6l9&6i4K6u0r3x3e0u0Q4x3V1j5I4z5q4)9J5c8X3!0T1K9X3y4Q4y4h3k6E0M7$3N6K6k6h3&6V1i4K6u0V1M7r3q4J5N6q4)9J5k6o6q4Q4x3X3c8@1K9r3g2Q4x3X3c8J5L8$3q4V1i4K6u0V1L8h3q4H3i4K6u0r3
8efK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3y4G2j5$3!0S2M7$3q4E0N6i4u0S2K9g2)9J5k6h3u0D9L8$3N6K6M7r3!0@1i4K6u0W2j5$3!0E0i4K6u0r3x3U0l9I4x3q4)9J5c8U0l9I4i4K6u0r3N6h3&6V1k6i4u0K6N6r3q4F1k6r3W2F1k6#2)9J5k6r3!0T1K9X3g2U0N6r3W2$3k6g2)9J5k6r3y4Q4x3X3c8J5N6h3&6@1K9h3#2W2i4K6u0W2K9s2c8E0L8l9`.`.
能力值:
( LV3,RANK:20 )
14 楼
收益, 前排
能力值:
( LV2,RANK:10 )
15 楼
第一次学习。
能力值:
( LV2,RANK:10 )
16 楼
非常感谢 学习了
能力值:
( LV2,RANK:10 )
17 楼
来赞赞,么么哒
能力值:
( LV3,RANK:30 )
18 楼
Mark..
能力值:
( LV2,RANK:10 )
19 楼
图没了
能力值:
( LV13,RANK:290 )
20 楼
x86分析,做个记录
能力值:
( LV2,RANK:10 )
21 楼
感谢分享
能力值:
( LV9,RANK:150 )
22 楼
赞
能力值:
( LV1,RANK:0 )
23 楼
objc_msgSend(&OBJC_CLASS___NSString, "stringWithFormat:", CFSTR("%@%@%d"));请问大哥,后面的参数的形参或值从哪里分析找到
能力值:
( LV1,RANK:0 )
24 楼
砖叔
objc_msgSend(&OBJC_CLASS___NSString, "stringWithFormat:", CFSTR("%@%@%d"));请 ...
同问
_objc_msgSend(&_OBJC_CLASS_$_NSString,"stringWithFormat:",&cf_%@);
lVar7 = _objc_retainAutoreleasedReturnValue();
这个stringWithFormat后面的参数消失了,怎么解析呢?
能力值:
( LV1,RANK:0 )
25 楼
厉害了