Apa yang dilakukan flag -all_load linker?

123

Saya tidak dapat menemukan di mana pun apa yang dilakukan flag -all_load saat mengompilasi kode Objective-C.

Saya memiliki beberapa masalah saat mengunggah binari ke Apple, mereka mengatakan itu karena saya tidak menggunakan bendera ini, tetapi kode saya terkompilasi bahkan tanpa itu.

Bisakah seseorang membantu saya dengan itu?

Terima kasih

Guy Ephraim
sumber
2
Biasanya, setiap kesalahan yang Anda lihat dengan ini terjadi pada perangkat saat menjalankan aplikasi. Apakah Anda mengatakan bahwa Anda tidak menguji aplikasi Anda pada perangkat keras sebenarnya sebelum dikirimkan untuk ditinjau oleh Apple? Jika demikian, itu ide yang sangat, sangat buruk.
Brad Larson
Saya telah mengujinya, namun konfigurasi "distribusi" saya - yang memiliki profil penyediaan toko aplikasi - tidak memiliki bendera dan semua pengujian dilakukan menggunakan profil pengembangan yang memiliki bendera sehingga semuanya tampak baik-baik saja, dan kapan Saya menyusunnya untuk toko aplikasi dengan profil distribusi benderanya mati, dan karena profil distribusi tidak dapat dipasang secara lokal, saya tidak dapat memeriksanya.
Guy Ephraim

Jawaban:

144

Mungkin terkait dengan catatan teknis ini https://developer.apple.com/library/content/qa/qa1490/_index.html

PENTING: Untuk aplikasi 64-bit dan iPhone OS, terdapat bug linker yang mencegah -ObjC memuat file objek dari pustaka statis yang hanya berisi kategori dan tidak ada kelas. Solusinya adalah dengan menggunakan tanda -all_load atau -force_load. -all_load memaksa linker untuk memuat semua file objek dari setiap arsip yang dilihatnya, bahkan yang tidak memiliki kode Objective-C. -force_load tersedia di Xcode 3.2 dan yang lebih baru. Ini memungkinkan kontrol butir yang lebih baik dari pemuatan arsip. Setiap opsi -force_load harus diikuti dengan jalur ke arsip, dan setiap file objek dalam arsip itu akan dimuat.

Sharjeel Aziz
sumber
3
Ya, ini terutama berperan dengan perpustakaan statis untuk iPhone. Jika mereka dikompilasi tanpa flag linker ini, kategori tersebut tidak disertakan dalam biner yang dibangun dan aplikasi apa pun yang menggunakan pustaka statis ini akan mengalami error runtime saat dijalankan pada perangkat keras iPhone OS.
Brad Larson
1
Bukankah seharusnya ada beberapa peringatan atau kesalahan dari metode yang hilang pada waktu kompilasi?
Guy Ephraim
18
Tidak, karena kategori ada pada waktu kompilasi, mereka tidak ditautkan ke biner akhir. Tetapi karena sifat dinamis dari pengiriman Obj-C, linker tidak mengarahkan kode panggilan langsung ke metode implementasi, jadi tidak pernah memperhatikan bahwa itu hilang. Kemudian saat runtime, Anda mendapatkan kaboom, sama seperti jika Anda menyebutnya menggunakan "-performSelector:"
Sophistifunk
14
Hanya ingin mengklarifikasi catatan teknis: Seringkali Anda menginginkan flag linker -ObjC, bukan -all_load. -all_load direkomendasikan dalam contoh (saya anggap langka) di mana Anda memiliki perpustakaan tanpa kelas, hanya kategori.
Chris Hill
3
Menurut stackoverflow.com/a/2615407/62 ini telah diperbaiki pada XCode 4.2, jadi Anda tidak memerlukan flag -all_load atau -force_load lagi. Anda masih membutuhkan -ObjC.
Liron Yahdav