Apa sebenarnya arti __block
kata kunci dalam Objective-C? Saya tahu ini memungkinkan Anda untuk memodifikasi variabel dalam blok, tetapi saya ingin tahu ...
- Apa sebenarnya yang dikatakannya kepada kompiler?
- Apakah itu melakukan hal lain?
- Jika hanya itu yang dilakukannya, mengapa itu diperlukan?
- Apakah ada di dokumen di mana saja? (Saya tidak dapat menemukannya).
objective-c
ios
objective-c-blocks
mjisrawi
sumber
sumber
__block
sama sekali.__block
harus diterjemahkan ke Swift: "Penutupan [dalam Swift] memiliki semantik tangkap yang sama dengan blok [di Objective-C] tetapi berbeda dalam satu cara kunci: Variabel lebih bisa diubah daripada disalin. Dengan kata lain, perilaku __block di Objective-C adalah perilaku default untuk variabel di Swift. " Dari buku Apple: Menggunakan Swift dengan Kakao dan Objective-C (Swift 2.2).Jawaban:
Ini memberitahu kompiler bahwa setiap variabel yang ditandai olehnya harus diperlakukan dengan cara khusus ketika digunakan di dalam blok. Biasanya, variabel dan isinya yang juga digunakan dalam blok disalin, sehingga setiap modifikasi yang dilakukan pada variabel-variabel ini tidak ditampilkan di luar blok. Ketika mereka ditandai dengan
__block
, modifikasi yang dilakukan di dalam blok juga terlihat di luarnya.Untuk contoh dan info lebih lanjut, lihat Tipe Penyimpanan __block di Topik Pemrograman Blok Apple .
Contoh penting adalah yang ini:
Dalam contoh ini, keduanya
localCounter
danlocalCharacter
dimodifikasi sebelum blok dipanggil. Namun, di dalam blok, hanya modifikasi yanglocalCharacter
akan terlihat, berkat__block
kata kunci. Sebaliknya, blok dapat memodifikasilocalCharacter
dan modifikasi ini terlihat di luar blok.sumber
localCounter
, tetapi itu memodifikasilocalCharacter
. Juga, perhatikan nilainyalocalCounter
di dalam blok: itu adalah 42, meskipun variabel bertambah sebelum blok dipanggil tetapi setelah blok dibuat (saat itulah nilainya "ditangkap").@bbum mencakup blok secara mendalam dalam posting blog dan menyentuh jenis penyimpanan __block.
Adapun kasus penggunaan Anda akan menemukan
__block
kadang-kadang digunakan untuk menghindari mempertahankan siklus karena tidak mempertahankan argumen. Contoh umum menggunakan self.sumber
__weak
cukup dalam kasus khusus ini juga? Mungkin sedikit lebih jelas ...Biasanya ketika Anda tidak menggunakan __block, blok akan menyalin (mempertahankan) variabel, jadi meskipun Anda memodifikasi variabel, blok memiliki akses ke objek yang lama.
Dalam 2 kasus ini Anda perlu __block:
1.Jika Anda ingin memodifikasi variabel di dalam blok dan mengharapkannya terlihat di luar:
2.Jika Anda ingin memodifikasi variabel setelah Anda mendeklarasikan blok dan Anda mengharapkan blok untuk melihat perubahan:
sumber
__block adalah kualifikasi penyimpanan yang dapat digunakan dalam dua cara:
Menandai bahwa suatu variabel tinggal di penyimpanan yang dibagi antara ruang lingkup leksikal dari variabel asli dan blok apa pun yang dinyatakan dalam ruang lingkup itu. Dan dentang akan menghasilkan struct untuk mewakili variabel ini, dan menggunakan struct ini dengan referensi (bukan oleh nilai).
Dalam MRC, __block dapat digunakan untuk menghindari mempertahankan variabel objek yang ditangkap blok. Berhati-hatilah karena ini tidak bekerja untuk ARC. Di ARC, Anda harus menggunakan __weak sebagai gantinya.
Anda dapat merujuk ke dokumen Apple untuk informasi terperinci.
sumber
__block
adalah tipe penyimpanan yang digunakan untuk membuat variabel ruang lingkup bisa berubah, lebih jelasnya jika Anda mendeklarasikan variabel dengan specifier ini, rujukannya akan diteruskan ke blok bukan salinan hanya baca untuk detail selengkapnya lihat Blok Pemrograman di iOSsumber
Semoga ini bisa membantu Anda
misalkan kita memiliki kode seperti:
itu akan memberikan kesalahan seperti "variabel tidak dapat ditentukan" karena variabel tumpukan di dalam blok secara default tidak dapat diubah.
menambahkan __block (pengubah penyimpanan) di depannya deklarasi membuatnya bisa berubah di dalam blok yaitu
__block int stackVariable=1;
sumber
Dari Spesifikasi Bahasa Blok :
Untuk perincian tentang apa yang harus dikompilasi oleh variabel __block, lihat Spesifikasi Implementasi Blok , bagian 2.3.
sumber
Ini berarti bahwa variabel itu adalah awalan untuk tersedia untuk digunakan dalam suatu blok.
sumber