ios - Objective-C内存管理面试题一道
大家讲道理
大家讲道理 2017-04-18 09:49:28
0
5
507

下面关于Objective-C内存管理的描述错误的是
A 当使用ARC来管理内存时,代码中不可以出现autorelease
B autoreleasepool 在 drain 的时候会释放在其中分配的对象
C 当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露
D 在使用ARC的项目中不能使用NSZone

= =。。
网上看到的,参考答案为A.

我觉得选C来的~

不知道A错在哪里了?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(5)
巴扎黑

Kesilapan A ialah apabila menggunakan ARC, pengkompil akan melarang anda daripada menggunakan autorelease, dan pengkompil akan membantu anda menambahkannya, sama seperti mengekalkan dan melepaskan. Tetapi anda boleh menggunakan __autoreleasing untuk menentukan pembolehubah dan menambahnya pada autoreleasepool

PHPzhong

Penerangan C adalah betul Menggunakan autoreleasepool boleh mempercepatkan pelepasan objek apabila sejumlah besar objek perlu dibuat.
Jika A salah, ini hanya bermakna pembuat soalan ingin menguji anda Prinsip ARC sebenarnya ialah pengkompil secara automatik menambah autorelease dan kod lain pada kod untuk anda. Malah, apabila menulis autorelease dalam projek ARC, ia tidak boleh disusun jika anda memikirkannya dengan cara ini, A sebenarnya betul.
Tetapi memandangkan tiga yang lain betul, saya hanya boleh memilih A.

==========Kemas kini=========
Saya harap orang yang tidak suka jawapan saya boleh beritahu saya apa yang salah di ruangan komen jawapan saya .
Walaupun saya hanya membuat spekulasi secara kasar mengapa A salah, saya dengan jelas menjawab bahawa poster C adalah betul.
Mengenai mengapa C betul, anda boleh membaca dokumen rasmi: autoreleasepool.

Jika anda menghasilkan utas sekunder.
Anda mesti mencipta blok kumpulan autorelease anda sendiri sebaik sahaja utas mula dilaksanakan jika tidak, aplikasi anda akan membocorkan objek (Lihat Blok dan Benang Autorelease untuk mendapatkan butiran. )

==========Dikemas kini sekali lagi=========
Dokumen di atas adalah mengenai MRC Anda boleh membaca sama ada kumpulan autorelease diperlukan untuk mencipta sejumlah besar objek dalam benang dalam ARC Jawapan ini:
http://stackoverflow.com/ques...

黄舟

A dan D pada asasnya adalah sama, tetapi sebenarnya
NSZone *zone = NSDefaultMallocZone();
kod ini boleh disusun dan dijalankan.

Jawapan rujukan yang anda baca adalah salah.
Di bawah ARC, anda tidak boleh menggunakan autorelease untuk pengaturcaraan, tetapi anda boleh menggunakan @autoreleasepool. Fungsinya adalah untuk mengurangkan penggunaan memori.

    @autoreleasepool {
    }

Kandungan berikut terutamanya sebagai balasan kepada @ChickenBoy "Setiap utas dalam aplikasi Koko mengekalkan timbunan blok kumpulan autorelease sendiri. Dalam urutan lain, anda perlu mencipta kumpulan autorelease sendiri, jika tidak, ia tidak akan menjadi dikeluarkan secara automatik dan memori akan dijana kebocoran.".

Setiap utas dalam aplikasi Koko mengekalkan timbunan blok kumpulan autorelease sendiri
Ayat ini hanya menyatakan satu fakta "Setiap utas dalam aplikasi Cocoa mengekalkan timbunan blok kolam autorelease sendiri"
Jika anda menulis. program Asas sahaja atau jika anda menanggalkan utas, anda perlu mencipta blok kumpulan autorelease anda sendiri.
Jika anda menulis aplikasi Foundation sahaja atau jika anda menanggalkan utas, anda perlu mencipta blok kumpulan autorelease anda sendiri Lepaskan blok kolam.

Jika aplikasi atau utas anda tahan lama dan berpotensi menjana banyak objek autoreleased, anda harus menggunakan autoreleased blok pool (seperti AppKit dan UIKit lakukan pada utas utama jika tidak, objek autoreleased terkumpul dan jejak memori anda bertambah. Jika benang tertanggal anda tidak membuat panggilan Cocoa, anda tidak perlu menggunakan blok autoreleased pool.
Jika aplikasi atau thread anda bertahan lama dan mungkin menghasilkan sejumlah besar objek autoreleased secara automatik blok; jika tidak, objek autoreleased akan terkumpul dan menduduki memori anda.
Jika benang yang anda buat tidak memanggil Cacoa, anda tidak perlu menggunakan blok kumpulan autorelease.

阿神

Apabila anda membuat sendiri utas baharu, anda perlu mengurus memori di dalamnya Hanya dalam runloop utas utama ia akan menambahkan autoreleasePush() dan autoreleasePop() untuk anda secara automatik.

巴扎黑

Kerana ARC ialah ciri pengkompil, bukan ciri masa jalan iOS atau pengumpul sampah dalam bahasa lain.
Jadi ini bermakna ia hanya boleh mengendalikan pengurusan memori yang ditentukan pada masa penyusunan, dan mekanisme yang digunakan ialah pengiraan rujukan.
Dalam erti kata lain, keluaran memorinya tidak wajib Contohnya, rujukan memori bersama, rujukan dinamik, dsb. akan menyebabkan kiraan rujukan tidak ditetapkan kepada 0 serta-merta, jadi keluaran eksplisit diperlukan pada masa ini.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan