能力值:
( 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 楼
能力值:
( LV12,RANK:530 )
9 楼
其实就是弄清楚objective-c runtime机制就可以了,Object-C 是通过 Dynamic Binding (动态绑定) 机制来实现消息传递的,对象对于详细的响应和处理都是在 runtime 运行时才能决定https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
http://blog.jobbole.com/79545/
能力值:
( 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篇文章。
http://www.friday.com/bbum/2009/12/18/objc_msgsend-part-1-the-road-map/
http://cocoasamurai.blogspot.com/2010/01/understanding-objective-c-runtime.html
能力值:
( 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 楼
厉害了