如果您尝试一下(菜单->产品->生成输出->程序集文件)-您会注意到在clang下几乎相同的输出-由于剩余的额外变量分配和调试信息而只有很小的变化。
简而言之-没有真正的区别;虽然我猜静态的可能更容易调试。
.align 4, 0x90
"-[Foo helloStringWithName1:]": ## @"\01-[Foo helloStringWithName1:]"
.cfi_startproc
Lfunc_begin0:
.loc 1 15 0 ## /Users/dirkx/tmp/ccccc/ccccc/main.m:15:0
## BB#0:
pushq %rbp
Ltmp2:
.cfi_def_cfa_offset 16
Ltmp3:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp4:
.cfi_def_cfa_register %rbp
subq $48, %rsp
movq %rdi, -8(%rbp)
movq %rsi, -16(%rbp)
movq %rdx, %rdi
callq _objc_retain
movq %rax, -24(%rbp)
.loc 1 17 5 prologue_end ## /Users/dirkx/tmp/ccccc/ccccc/main.m:17:5
Ltmp5:
movq L_OBJC_CLASSLIST_REFERENCES_$_(%rip), %rax
movq "-[Foo helloStringWithName1:].formatString"(%rip), %rdx
movq -24(%rbp), %rcx
movq L_OBJC_SELECTOR_REFERENCES_(%rip), %rsi
movq %rax, %rdi
movb $0, %al
callq _objc_msgSend
movq %rax, %rdi
callq _objc_retainAutoreleasedReturnValue
movabsq $0, %rsi
leaq -24(%rbp), %rcx
movl $1, -28(%rbp)
.loc 1 18 1 ## /Users/dirkx/tmp/ccccc/ccccc/main.m:18:1
movq %rcx, %rdi
movq %rax, -40(%rbp) ## 8-byte Spill
callq _objc_storeStrong
Ltmp6:
.loc 1 18 1 ## /Users/dirkx/tmp/ccccc/ccccc/main.m:18:1
movq -40(%rbp), %rax ## 8-byte Reload
movq %rax, %rdi
callq _objc_autoreleaseReturnValue
.loc 1 17 5 ## /Users/dirkx/tmp/ccccc/ccccc/main.m:17:5
Ltmp7:
addq $48, %rsp
popq %rbp
ret
Ltmp8:
Lfunc_end0:
.cfi_endproc
相对
.align 4, 0x90
"-[Foo helloStringWithName2:]": ## @"\01-[Foo helloStringWithName2:]"
.cfi_startproc
Lfunc_begin1:
.loc 1 20 0 ## /Users/dirkx/tmp/ccccc/ccccc/main.m:20:0
## BB#0:
pushq %rbp
Ltmp11:
.cfi_def_cfa_offset 16
Ltmp12:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp13:
.cfi_def_cfa_register %rbp
subq $48, %rsp
movq %rdi, -8(%rbp)
movq %rsi, -16(%rbp)
movq %rdx, %rdi
callq _objc_retain
leaq L__unnamed_cfstring_2(%rip), %rdx <--------------------
movq %rax, -24(%rbp)
.loc 1 21 5 prologue_end ## /Users/dirkx/tmp/ccccc/ccccc/main.m:21:5
Ltmp14:
movq L_OBJC_CLASSLIST_REFERENCES_$_(%rip), %rax
movq -24(%rbp), %rcx
movq L_OBJC_SELECTOR_REFERENCES_(%rip), %rsi
movq %rax, %rdi
movb $0, %al
callq _objc_msgSend
movq %rax, %rdi
callq _objc_retainAutoreleasedReturnValue
movabsq $0, %rsi
leaq -24(%rbp), %rcx
movl $1, -28(%rbp)
.loc 1 22 1 ## /Users/dirkx/tmp/ccccc/ccccc/main.m:22:1
movq %rcx, %rdi
movq %rax, -40(%rbp) ## 8-byte Spill
callq _objc_storeStrong
Ltmp15:
.loc 1 22 1 ## /Users/dirkx/tmp/ccccc/ccccc/main.m:22:1
movq -40(%rbp), %rax ## 8-byte Reload
movq %rax, %rdi
callq _objc_autoreleaseReturnValue
.loc 1 21 5 ## /Users/dirkx/tmp/ccccc/ccccc/main.m:21:5
Ltmp16:
addq $48, %rsp
popq %rbp
ret
Ltmp17:
Lfunc_end1:
.cfi_endproc
作为关键参考:
Lfunc_end2:
.cfi_endproc
.section __DATA,__data
.align 3 ## @"\01-[Foo helloStringWithName1:].formatString"
"-[Foo helloStringWithName1:].formatString":
.quad L__unnamed_cfstring_
.section __TEXT,__cstring,cstring_literals
l_.str: ## @.str
.asciz "Hello 1 %@!"
和
.section __TEXT,__cstring,cstring_literals
l_.str1: ## @.str1
.asciz "Hello 2 %@!"