【发布时间】:2013-06-12 16:38:41
【问题描述】:
我希望用我自己的实现替换我的 iPhone 应用程序中的默认 CFAllocator。我想控制UIWebView 分配的内存,因为它在加载网站后似乎保留了这么多内存,而当UIWebView 被释放时,这些内存仍然存在。
在我调用CFAllocatorSetDefault 之后,当下一次分配发生时,我得到一个EXC_BREAKPOINT 异常。
异常似乎发生在对CFRetain 的调用中(在模拟器中完成,但在设备上发生同样的事情):
CoreFoundation`CFRetain:
0x1c089b0: pushl %ebp
0x1c089b1: movl %esp, %ebp
0x1c089b3: pushl %edi
0x1c089b4: pushl %esi
0x1c089b5: subl $16, %esp
0x1c089b8: calll 0x1c089bd ; CFRetain + 13
0x1c089bd: popl %edi
0x1c089be: movl 8(%ebp), %esi
0x1c089c1: testl %esi, %esi
0x1c089c3: jne 0x1c089db ; CFRetain + 43
0x1c089c5: int3
0x1c089c6: calll 0x1d66a00 ; symbol stub for: getpid <- EXC_BREAKPOINT (code=EXC_I386_BPT subcode=0x0)
0x1c089cb: movl %eax, (%esp)
0x1c089ce: movl $9, 4(%esp)
0x1c089d6: calll 0x1d66a4e ; symbol stub for: kill
0x1c089db: movl (%esi), %eax
0x1c089dd: testl %eax, %eax
0x1c089df: je 0x1c08a17 ; CFRetain + 103
0x1c089e1: cmpl 1838519(%edi), %eax
0x1c089e7: je 0x1c08a17 ; CFRetain + 103
0x1c089e9: movl 4(%esi), %ecx
0x1c089ec: shrl $8, %ecx
0x1c089ef: andl $1023, %ecx
0x1c089f5: cmpl 1834423(%edi,%ecx,4), %eax
0x1c089fc: je 0x1c08a17 ; CFRetain + 103
0x1c089fe: movl 1766575(%edi), %eax
0x1c08a04: movl %eax, 4(%esp)
0x1c08a08: movl %esi, (%esp)
0x1c08a0b: calll 0x1d665c8 ; symbol stub for: objc_msgSend
【问题讨论】:
-
请注意,WebKit 无论如何都不会使用 CF 的分配器。它有自己的。
-
@Catfish_Man 你确定吗?请参阅我的更新答案。
-
相当肯定。它可能会使用 CF 的分配器进行一些附带分配,但大部分实际的 WebCore/JSCore 分配使用 FastMalloc。
标签: iphone ios memory-management uiwebview core-foundation