iOS   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了objective-c – 可以在编译时看到ARC生成的代码吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我在“摘要”部分阅读了 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
我在“摘要”部分阅读了 Transitioning to ARC Release Notes.他们说 :

我不知道ARC修正了我们的代码的结果.

我的问题:我们可以看到这个变化吗? (在分配,保留,分配或释放的期限中.没有组合级别!)

原因:因为我认为在没有ARC模式的旧传统开发中看到最佳实践代码是很好的.

解决方法

通过将ObjC中的代码重写为ObjC,但是在代码生成过程中会发出额外的保留/释放LLVM位代码.这意味着,不可能知道编译器如何“修复”它,而不需要进入LLVM IR /程序集级别.

如果编译器可以减少通过代码次数,总是更好.

要获得汇编代码,您也可以

>直接从编译器生成程序集.在命令行中,在调用编译器时添加-S标志.结果是包含汇编代码的.S文件.在Xcode项目中,打开源代码文件,然后转到产品(菜单栏)→生成输出→汇编文件.
>生成对象文件,然后反汇编.内置命令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,#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,[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,pc
    ldr        r2,[r0]
    add        r0,#0x8
    blx        _objc_msgSend_stret
    b          L25c4

L25ba:
    add        r0,#0x8
    vmov.i32   q8,#0x80
    vstmia     r0,{d16-d17}

L25c4:
    mov        r1,(0x3448 - 0x25d2)        ; @SELEctor(initWithFrame:)
    ldr        r0,#0x10]
    add        r1,#0x8]
    ldr        r3,#0xc]
    ldr        r4,#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,[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,r8
    mov        r1,r5
    blx        _objc_msgSend
    mov        r7,r7
    blx        _objc_retainAutoreleasedReturnValue
    mov        r1,(0x3454 - 0x2630)        ; @SELEctor(whiteColor)
    mov        r6,#(0x346C - 0x2636)       ; _OBJC_CLASS_$_UIColor
    add        r1,r7
    blx        _objc_retainAutoreleasedReturnValue
    mov        r4,(0x3458 - 0x2652)        ; @SELEctor(setBACkgroundColor:)
    mov        r2,r6
    blx        _objc_msgSend
    mov        r0,r6
    blx        _objc_release
    mov        r0,(0x345C - 0x2680)        ; @SELEctor(makeKeyAndVisiblE)
    add        r0,r4
    blx        _objc_msgSend
    mov        r0,r4
    blx        _objc_release
    movs       r0,#1
    add        sp,#0x18
    ldr.w      r8,[sp],#4
    pop        {r4-r7,pc}

没有详细介绍,你可以看到有很多_objc_release和_objc_retainAutoreleasedReturnValue.这些是代码中插入的ARC.手工解压,我们会得到:

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生成的代码吗?全部内容,希望文章能够帮你解决objective-c – 可以在编译时看到ARC生成的代码吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。