Pada halaman 17 dari presentasi WWDC14 ini , dikatakan
Bekerja dengan Objective-C? Masih harus mengelola autorelease pools
autoreleasepool {/ * code * /}
Apa artinya? Apakah ini berarti bahwa jika basis kode saya tidak memiliki file Objective-C, autoreleasepool {}
apakah tidak diperlukan?
Dalam jawaban dari pertanyaan terkait , ada contoh yang autoreleasepool
bisa berguna:
- (void)useALoadOfNumbers {
for (int j = 0; j < 10000; ++j) {
@autoreleasepool {
for (int i = 0; i < 10000; ++i) {
NSNumber *number = [NSNumber numberWithInt:(i+j)];
NSLog(@"number = %p", number);
}
}
}
}
Jika kode di atas diterjemahkan ke Swift dengan autoreleasepool
drop, apakah Swift cukup pintar untuk mengetahui bahwa number
variabel harus dilepaskan setelah yang pertama }
(seperti beberapa bahasa lain)?
memory-management
swift
Ethan
sumber
sumber
autoreleasepool
Swift. Saya memperluas pertanyaan Anda dan menanyakannya di forum pengembang .Jawaban:
The
autoreleasepool
pola yang digunakan di Swift ketika kembaliautorelease
objek (dibuat oleh salah kode Objective-C atau menggunakan kelas Cocoa). Theautorelease
pola dalam fungsi Swift banyak seperti itu tidak di Objective-C. Misalnya, pertimbangkan rendisi Swift metode Anda (instantiatingNSImage
/UIImage
objek):Jika Anda menjalankan ini di Instrumen, Anda akan melihat grafik alokasi seperti berikut:
Tetapi jika Anda melakukannya tanpa kumpulan rilis otomatis, Anda akan melihat bahwa penggunaan memori puncak lebih tinggi:
Itu
autoreleasepool
memungkinkan Anda untuk mengelola secara eksplisit saat objek autorelease dibatalkan alokasinya di Swift, seperti yang bisa Anda lakukan di Objective-C.Catatan: Saat menangani objek asli Swift, biasanya Anda tidak akan menerima objek rilis otomatis. Inilah mengapa presentasi menyebutkan peringatan tentang hanya membutuhkan ini saat "bekerja dengan Objective-C", meskipun saya berharap Apple lebih jelas dalam hal ini. Tapi jika Anda berurusan dengan objek Objective-C (termasuk kelas Cocoa), mereka mungkin objek autorelease, dalam hal ini rendisi Swift
@autoreleasepool
pola Objective-C ini masih berguna.sumber
println
masukdeinit
, dan ini menjadi sangat mudah untuk memverifikasi secara tepat ketika objek dibatalkan alokasinya. Atau amati di Instrumen. Sebagai jawaban atas pertanyaan Anda, tampaknya objek Swift dikembalikan dari fungsi dengan jumlah retensi +1 (bukan objek autorelease), dan pemanggil akan mengelola kepemilikan dengan mulus dari titik itu (misalnya, jika dan saat objek yang dikembalikan berada di luar cakupan, segera dialokasikan, tidak ditempatkan di alat autoreleasepool).NSImage
/UIImage
objek dan mewujudkan masalah secara lebih konsisten (dan, terus terang, ini adalah contoh masalah yang lebih umum, karena penggunaan memori puncak seringkali hanya bermasalah saat menangani objek yang lebih besar; contoh praktis dari ini mungkin rutinitas mengubah ukuran banyak gambar). Saya juga mereproduksi perilaku yang memanggil kode Objective-C yang secara eksplisit membuat objek autorelease. Jangan salah paham: Saya pikir kita membutuhkan kumpulan rilis otomatis di Swift lebih jarang daripada di Objective-C, tetapi masih memiliki peran untuk dimainkan.pathForResource:ofType:
berulang kali.pathForResource:ofType:
Contoh saya tidak lagi berfungsi di Xcode 6.3 / Swift 1.2. :)Jika Anda akan menggunakannya dalam kode Objective-C yang setara, maka Anda akan menggunakannya di Swift.
Hanya jika Objective-C melakukannya. Keduanya beroperasi di sepanjang aturan manajemen memori Cocoa.
Tentu saja ARC tahu bahwa
number
keluar dari ruang lingkup pada akhir iterasi loop tersebut, dan jika dipertahankan, itu akan melepaskannya di sana. Namun, itu tidak memberi tahu Anda apakah objek itu dirilis secara otomatis, karena-[NSNumber numberWithInt:]
mungkin atau mungkin tidak mengembalikan instance yang dirilis secara otomatis. Tidak mungkin Anda dapat mengetahuinya, karena Anda tidak memiliki akses ke sumber-[NSNumber numberWithInt:]
.sumber
autoreleasepool
konstruksinya sama sekali tidak diperlukan. Tetapi jika kode Swift Anda menangani objek Objective-C (termasuk objek Cocoa), objek tersebut mengikuti pola autorelease, dan dengan demikianautoreleasepool
konstruksi menjadi berguna.