gpt4 book ai didi

objective-c - 是否可以在编译时看到ARC生成的代码?

转载 作者:太空狗 更新时间:2023-10-30 03:18:51 26 4
gpt4 key购买 nike

我已阅读 Transitioning to ARC Release Notes在“摘要”部分。他们告诉:

ARC works by adding code at compile time to ensure that objects live as long as necessary, but no longer. Conceptually, it follows the same memory management conventions as manual reference counting (described in Advanced Memory Management Programming Guide) by adding the appropriate memory management calls for you.

In order for the compiler to generate correct code

我想知道 ARC 更正我们的代码的结果是什么。

我的问题:我们能看到变化吗? (在 alloc 、 retain 、 assign 或 release 的术语中。不是汇编级别!)

原因:因为我认为在没有 ARC 模式的情况下看到老传统开发中的最佳实践代码是件好事。

最佳答案

通过将代码从 ObjC 重写为 ObjC,clang 中的 ARC 无法工作,但会在代码生成期间发出额外的保留/释放 LLVM 位码。这意味着,如果不进入 LLVM IR/汇编级别,就不可能知道编译器如何“修复”它。


If ARC emit the LLVM bitcode as you said. Is it made for the purpose that use less time in compile process? (less complex ObjC code, less header file?)

如果编译器能够减少通过代码的次数,那总是更好。


Can you show me some example or utility that show the code in assembly level?

要获取汇编代码,您可以

  1. 直接从编译器生成程序集。在命令行中,添加 -S调用编译器时标记。结果是 .S包含汇编代码的文件。在 Xcode 项目中,打开源代码文件,然后转到产品(在菜单栏上)→ 生成输出程序集文件。程序集文件。程序集文件。 p>

  2. 生成目标文件,然后反汇编。内置命令 otool -tvV <file>可以进行反汇编,还有像otx这样的高级工具(免费)或 IDA (免费评估)。

我更喜欢路线 2,因为它产生的垃圾较少,而且可以配置反汇编工具以产生更多有用的信息。不管怎样,无论使用哪种方法,您都需要能够阅读汇编代码。

以这段代码为例:

- (BOOL)application:(UIApplication*)application 
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}

编译后会生成如下程序集(使用IDA分析):

-[SomeAppDelegate application:didFinishLaunchingWithOptions:]:    push       {r4-r7,lr}    add        r7, sp, #0xC    str.w      r8, [sp,-#0x4]!    sub        sp, sp, #0x18    movw       r1, #(0x343c - 0x2574)       ; @selector(alloc)    mov        r8, r0    movt.w     r1, #0    mov        r0, (0x3464 - 0x2576)        ; _OBJC_CLASS_$_UIWindow    add        r1, pc    add        r0, pc    ldr        r1, [r1]    ldr        r0, [r0]    blx        _objc_msgSend    mov        r1, (0x3440 - 0x258e)        ; @selector(mainScreen)    mov        r6, r0    movw       r0, #(0x3468 - 0x2594)       ; _OBJC_CLASS_$_UIScreen    add        r1, pc    movt.w     r0, #0    add        r0, pc    ldr        r1, [r1]    ldr        r0, [r0]    blx        _objc_msgSend    mov        r7, r7    blx        _objc_retainAutoreleasedReturnValue    mov        r5, r0    cbz        r5, L25ba    movw       r0, #(0x3444 - 0x25b2)       ; @selector(bounds)    mov        r1, r5    movt.w     r0, #0    add        r0, pc    ldr        r2, [r0]    add        r0, sp, #0x8    blx        _objc_msgSend_stret    b          L25c4L25ba:    add        r0, sp, #0x8    vmov.i32   q8, #0x80    vstmia     r0, {d16-d17}L25c4:    mov        r1, (0x3448 - 0x25d2)        ; @selector(initWithFrame:)    ldr        r0, [sp,#0x10]    add        r1, pc    ldr        r2, [sp,#0x8]    ldr        r3, [sp,#0xc]    ldr        r4, [sp,#0x14]    stmea.w    sp, {r0,r4}    mov        r0, r6    ldr        r1, [r1]    blx        _objc_msgSend    mov        r4, r0    mov        r0, (0x344c - 0x25F2)        ; @selector(setWindow:)    mov        r2, r4    add        r0, pc    ldr        r1, [r0]    mov        r0, r8    blx        _objc_msgSend    mov        r0, r4    blx        _objc_release    mov        r0, r5    blx        _objc_release    mov        r0, (0x3450 - 0x2610)        ; @selector(window)    add        r0, pc    ldr        r5, [r0]    mov        r0, r8    mov        r1, r5    blx        _objc_msgSend    mov        r7, r7    blx        _objc_retainAutoreleasedReturnValue    mov        r1, (0x3454 - 0x2630)        ; @selector(whiteColor)    mov        r6, r0    movw       r0, #(0x346C - 0x2636)       ; _OBJC_CLASS_$_UIColor    add        r1, pc    movt.w     r0, #0    add        r0, pc    ldr        r1, [r1]    ldr        r0, [r0]    blx        _objc_msgSend    mov        r7, r7    blx        _objc_retainAutoreleasedReturnValue    mov        r4, r0    mov        r0, (0x3458 - 0x2652)        ; @selector(setBackgroundColor:)    mov        r2, r4    add        r0, pc    ldr        r1, [r0]    mov        r0, r6    blx        _objc_msgSend    mov        r0, r4    blx        _objc_release    mov        r0, r6    blx        _objc_release    mov        r0, r8    mov        r1, r5    blx        _objc_msgSend    mov        r7, r7    blx        _objc_retainAutoreleasedReturnValue    mov        r4, r0    mov        r0, (0x345C - 0x2680)        ; @selector(makeKeyAndVisible)    add        r0, pc    ldr        r1, [r0]    mov        r0, r4    blx        _objc_msgSend    mov        r0, r4    blx        _objc_release    movs       r0, #1    add        sp, sp, #0x18    ldr.w      r8, [sp], #4    pop        {r4-r7,pc}

Without going into detail, you can see there are many _objc_release and _objc_retainAutoreleasedReturnValue. These are what ARC inserts during code-gen. Decompiling it by hand, we'll get:

UIScreen* r5 = objc_retainAutoreleasedReturnValue([UIScreen mainScreen]);
CGRect sp8 = r5 != nil ? [r5 bounds] : CGRectZero;
UIWindow* r4 = [[UIWindow alloc] initWithFrame:sp8];
[self setWindow:r4];
objc_release(r4);
objc_release(r5);

UIWindow* r6a = objc_retainAutoreleasedReturnValue([self window])
UIColor* r4a = objc_retainAutoreleasedReturnValue([UIColor whiteColor])
[r6a setBackgroundColor:r4a];
objc_release(r4a);
objc_release(r6a);

UIWindow* r4b = objc_retainAutoreleasedReturnValue([self window])
[r4b makeKeyAndVisible];
objc_release(r4b);

return 1;

这与 @c roald 相同的链接描述。

关于objective-c - 是否可以在编译时看到ARC生成的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10429857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com