Mac Cocoa: Tidak dapat melepaskan jendela untuk mendapatkan kembali memorinya

Saya memiliki aplikasi yang ditulis dalam Kakao dengan ARC yang memungkinkan pengguna membuat dan membuka jendela baru. (Ini seperti model dokumen, tapi saya tidak menggunakan nsdocument.)

Setiap jendela baru memerlukan sejumlah besar memori, yang ingin saya dapatkan kembali jika pengguna menutup jendela.

Saya memahami bahwa [window close] hanya menyembunyikan jendela, tetapi saya juga menggunakan [[self window] setReleasedWhenClosed:YES], tetapi NSwindowcontroller dan jendelanya masih ada setelah penutupan.

Objek di file xib jendela saya berisi sejumlah array c besar yang dialokasikan dengan malloc, jadi saya juga mencoba membebaskannya dengan mengirimkan panggilan ke pusat notifikasi di dalam metode windowWillClose: pengontrol jendela, di mana notifikasi tersebut memanggil metode di dalam objek yang relevan untuk membebaskan array C sebelum jendela ditutup. Sekali lagi, ini tidak berpengaruh - meskipun metode yang mencoba untuk membebaskan array dipanggil dan array tampaknya dibebaskan, menurut Activity Monitor, tidak ada memori yang dilepaskan. Saya juga telah mencoba membebaskan array di -(void) dealloc, tetapi tampaknya ini tidak pernah berakhir.

Jadi, bagaimana cara terbaik mendapatkan kembali memori ketika jendela ditutup?

Sunting: Menurut komentar di halaman stackoverflow ini oleh Benoit,

"Namun, pelepasan saat ditutup diabaikan untuk jendela yang dimiliki oleh pengontrol jendela."

Benarkah itu? Jika ya, bagaimana cara menyiasatinya di ARC?


person Christian J. B.    schedule 23.11.2012    source sumber


Jawaban (1)


Memori yang dilepaskan tidak selalu dapat dikembalikan ke sistem operasi. Ini hanyalah sebuah fakta kehidupan, setidaknya pada sistem yang tidak memiliki pengumpul sampah pemadatan.

Jangan memperhatikan statistik di Monitor Aktivitas kecuali Anda tepat apa yang Anda lihat. Informasi tersebut secara umum tidak berguna kecuali Anda memiliki pengetahuan yang cukup menyeluruh tentang sistem — termasuk memori virtual, bagian mana dari memori Anda yang digunakan oleh perpustakaan bersama, dan perilaku pengalokasi yang Anda gunakan. Kelas NSArray dan NSMutableArray memiliki beberapa perilaku yang cukup buram dalam hal alokasi, mereka umumnya bukan array linier seperti namanya.

Saran: Selama jendela Anda kosong, abaikan statistik di Monitor Aktivitas. Anda dapat menggunakan Instrumen untuk memeriksa kebocoran.

Sebagai contoh mengapa Monitor Aktivitas harus diabaikan: jika Anda membuat alokasi 500 MiB dalam 1 potongan KiB, lalu mengosongkan potongan bernomor ganjil, jelas potongan tersebut tidak dapat dikembalikan ke sistem operasi karena granularitas halamannya adalah 4 KiB minimum pada sebagian besar sistem modern. Jika Anda mengalokasikan 500 MiB yang sama dalam 1 MiB bongkahan dan membebaskan bongkahan bernomor ganjil, bongkahan tersebut akan dikembalikan ke OS dan penggunaan memori akan turun sebesar 250 MiB seperti yang dilaporkan oleh Activity Monitor. (Perhatikan bahwa ambang batas 4 KiB BUKAN ambang batas di mana perilaku ini terjadi. Hal ini bergantung pada perilaku alokasi yang tepat sebesar malloc(), dan beberapa parameter yang, pada OS X, bergantung pada CPU dan jumlah RAM.)

Namun, itu mungkin tidak relevan. Dalam setiap kasus, jika Anda mengalokasikan 250 MiB lagi, Anda akan kembali ke awal. Sebaiknya gunakan lebih sedikit memori pribadi, tetapi ini hanya memengaruhi seberapa baik aplikasi Anda dapat diputar dengan aplikasi lain.

person Dietrich Epp    schedule 23.11.2012
comment
Terima kasih, tapi saya tidak yakin macbook 2009 saya cukup kuat untuk menjalankan Instrumen. Saya membuatnya tersendat-sendat dan membuat kipas laptop menjadi overdrive selama sekitar 10 menit untuk memantau pembukaan satu jendela, yang biasanya memakan waktu sekitar 5 detik dengan Instrumen tidak berjalan. - person Christian J. B.; 23.11.2012
comment
@ChristianJ.B.: Hm, itu menarik. Mac saya dari tahun 2005 dapat menjalankannya dengan cukup baik... - person Dietrich Epp; 23.11.2012
comment
Saya sedang menjalankan Kebocoran Instrumen jika itu bisa membantu. - person Christian J. B.; 23.11.2012
comment
@ChristianJ.B.: Sebagai pendeteksi kebocoran orang miskin, Anda dapat membuka dan menutup beberapa jendela, mengukur penggunaan memori, lalu membuka dan menutup lebih banyak jendela (tetapi tidak pernah membuka lebih banyak jendela secara bersamaan). Jika penggunaan memori terus meningkat saat Anda membuka dan menutup jendela, berarti ada kebocoran. - person Dietrich Epp; 23.11.2012
comment
@ChristianJ.B.: Jika Anda tidak dapat menjalankan Instrumen maka saya tidak tahu harus berkata apa. Coba ajukan pertanyaan tentang mengapa pendeteksi kebocoran Instrumen tidak berfungsi. Saya tidak menemukan penurunan kinerja yang nyata saat menggunakan pendeteksi kebocoran pada MacBook Air terbawah saya -- semuanya berjalan lancar seperti biasanya. - person Dietrich Epp; 23.11.2012
comment
Saya menemukan halaman stackoverflow tentang Instrumen yang berjalan lambat. Saya akan mencoba menjalankannya secara terpisah dan tidak memanggilnya dari profil - person Christian J. B.; 23.11.2012