大佬教程收集整理的这篇文章主要介绍了objective-c – 可以在编译时看到ARC生成的代码吗?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我不知道ARC修正了我们的代码的结果.
我的问题:我们可以看到这个变化吗? (在分配,保留,分配或释放的期限中.没有组合级别!)
原因:因为我认为在没有ARC模式的旧传统开发中看到最佳实践代码是很好的.
要获得汇编代码,您也可以
>直接从编译器生成程序集.在命令行中,在调用编译器时添加-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;
以上是大佬教程为你收集整理的objective-c – 可以在编译时看到ARC生成的代码吗?全部内容,希望文章能够帮你解决objective-c – 可以在编译时看到ARC生成的代码吗?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。