Я изменил пример программы на это:
struct L {
#if DEBUG
static let og:((String) -> Void)? = { print($0) }
#else
static let og:((String) -> Void)? = nil
#endif
}
L.og?("Howdy!")
let a = 0
Я создаю программу с swift build -c debug
и снова с swift build -c release
.
Ниже приведена таблица символов отладки. Моя командная строка терминала - «" », и любой текст после нее до новой строки - это то, что я набрал.
? objdump -macho -indirect-symbols ./.build/x86_64-apple-macosx/debug/swiftHW
./.build/x86_64-apple-macosx/debug/swiftHW:
Indirect symbols for (__TEXT,__stubs) 8 entries
address index name
0x0000000100000ec2 75 _$sSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC
0x0000000100000ec8 77 _$ss27_allocateUninitializedArrayySayxG_BptBwlFyp_Tg5
0x0000000100000ece 78 _$ss5print_9separator10terminatoryypd_S2StF
0x0000000100000ed4 80 _swift_bridgeObjectRelease
0x0000000100000eda 81 _swift_bridgeObjectRetain
0x0000000100000ee0 82 _swift_once
0x0000000100000ee6 83 _swift_release
0x0000000100000eec 84 _swift_retain
Indirect symbols for (__DATA,__nl_symbol_ptr) 2 entries
address index name
0x0000000100001000 85 dyld_stub_binder
0x0000000100001008 ABSOLUTE
Indirect symbols for (__DATA,__got) 1 entries
address index name
0x0000000100001010 76 _$sSSN
Indirect symbols for (__DATA,__la_symbol_ptr) 8 entries
address index name
0x0000000100001018 75 _$sSS21_builtinStringLiteral17utf8CodeUnitCount7isASCIISSBp_BwBi1_tcfC
0x0000000100001020 77 _$ss27_allocateUninitializedArrayySayxG_BptBwlFyp_Tg5
0x0000000100001028 78 _$ss5print_9separator10terminatoryypd_S2StF
0x0000000100001030 80 _swift_bridgeObjectRelease
0x0000000100001038 81 _swift_bridgeObjectRetain
0x0000000100001040 82 _swift_once
0x0000000100001048 83 _swift_release
0x0000000100001050 84 _swift_retain
Вот таблица символов выпуска:
? objdump -macho -indirect-symbols ./.build/x86_64-apple-macosx/release/swiftHW
./.build/x86_64-apple-macosx/release/swiftHW:
Indirect symbols for (__TEXT,__stubs) 3 entries
address index name
0x0000000100000f14 12 _swift_once
0x0000000100000f1a 13 _swift_release
0x0000000100000f20 14 _swift_retain
Indirect symbols for (__DATA,__nl_symbol_ptr) 2 entries
address index name
0x0000000100001000 15 dyld_stub_binder
0x0000000100001008 ABSOLUTE
Indirect symbols for (__DATA,__la_symbol_ptr) 3 entries
address index name
0x0000000100001010 12 _swift_once
0x0000000100001018 13 _swift_release
0x0000000100001020 14 _swift_retain
Обратите внимание, чтосимволы для печати (_$ss5print_9separator10terminatoryypd_S2StF
) не включены. Я совершенно уверен, что это означает, что компилятор оптимизировал удаление строки L.og?("Howdy!")
из двоичного файла выпуска.