Mac Cocoa: ไม่สามารถปล่อยหน้าต่างเพื่อเรียกคืนหน่วยความจำได้

ฉันมีแอปพลิเคชันที่เขียนด้วยภาษา Cocoa พร้อมด้วย ARC ซึ่งช่วยให้ผู้ใช้สามารถสร้างและเปิดหน้าต่างใหม่ได้ (มันก็เหมือนกับโมเดลเอกสาร แต่ฉันไม่ได้ใช้ nsdocument)

หน้าต่างใหม่แต่ละหน้าต่างต้องใช้หน่วยความจำจำนวนมาก ซึ่งฉันต้องการเรียกคืนหากผู้ใช้ปิดหน้าต่าง

ฉันเข้าใจว่า [window close] เพียงซ่อนหน้าต่าง แต่ฉันก็ใช้ [[self window] setReleasedWhenClosed:YES] เช่นกัน แต่ทั้ง NSwindowcontroller และหน้าต่างยังคงมีอยู่หลังจากปิด

อ็อบเจ็กต์ในไฟล์ xib ของหน้าต่างของฉันมีอาร์เรย์ c ขนาดใหญ่จำนวนหนึ่งที่จัดสรรด้วย malloc ดังนั้นฉันจึงได้ลองปล่อยพวกมันออกโดยส่งการเรียกไปยังศูนย์การแจ้งเตือนภายในเมธอด windowWillClose: ของ windowcontroller โดยที่การแจ้งเตือนจะเรียกเมธอดภายในอ็อบเจ็กต์ที่เกี่ยวข้อง เพื่อเพิ่มอาร์เรย์ C ก่อนที่หน้าต่างจะปิด อีกครั้ง สิ่งนี้จะไม่มีผลใด ๆ แม้ว่าวิธีการพยายามปล่อยอาร์เรย์จะถูกเรียกและเห็นได้ชัดว่าอาร์เรย์นั้นถูกปล่อยว่างตาม Activity Monitor แต่ไม่มีหน่วยความจำใดถูกปล่อยออกมา ฉันได้ลองปล่อยอาร์เรย์ใน -(void) dealloc แล้ว แต่ดูเหมือนว่าจะไม่ถูกเรียกเมื่อปิด

ดังนั้นฉันจะได้รับหน่วยความจำกลับคืนได้ดีที่สุดเมื่อปิดหน้าต่างอย่างไร

แก้ไข: ตามความคิดเห็นในหน้า stackoverflow นี้ โดย Benoit

"การเปิดตัวเมื่อปิดจะถูกละเว้นสำหรับหน้าต่างที่เป็นของตัวควบคุมหน้าต่าง"

เป็นเรื่องจริงเหรอ? หากเป็นเช่นนั้น ฉันจะแก้ไขสิ่งนั้นใน ARC ได้อย่างไร


person Christian J. B.    schedule 23.11.2012    source แหล่งที่มา


คำตอบ (1)


หน่วยความจำที่ปล่อยออกมาไม่สามารถส่งคืนไปยังระบบปฏิบัติการได้เสมอไป นี่เป็นเพียงความจริงของชีวิต อย่างน้อยก็ในระบบที่ไม่มีเครื่องรวบรวมขยะแบบบดอัด

อย่า ใส่ใจกับสถิติในการตรวจสอบกิจกรรม เว้นแต่คุณจะรู้แน่ชัดว่าคุณกำลังดูอะไรอยู่ โดยทั่วไปข้อมูลจะไม่มีประโยชน์เว้นแต่คุณจะมีความรู้เกี่ยวกับระบบอย่างถี่ถ้วน รวมถึงหน่วยความจำเสมือน ส่วนใดของหน่วยความจำของคุณที่ไลบรารีที่แบ่งใช้ใช้งาน และลักษณะการทำงานของตัวจัดสรรที่คุณใช้อยู่ คลาส NSArray และ NSMutableArray มีลักษณะการทำงานที่ค่อนข้างคลุมเครือเมื่อพูดถึงการจัดสรร โดยทั่วไปแล้วจะ ไม่ใช่ อาร์เรย์เชิงเส้นตามชื่อที่แนะนำ

คำแนะนำ: ตราบใดที่หน้าต่างของคุณว่าง ไม่ต้องสนใจสถิติในตัวติดตามกิจกรรม คุณสามารถใช้เครื่องมือเพื่อตรวจสอบรอยรั่วได้

ตามตัวอย่างว่าทำไมตัวตรวจสอบกิจกรรมจึงถูกละเว้น: หากคุณทำการจัดสรร 500 MiB ใน 1 KiB chunks แล้วปล่อยก้อนที่เป็นเลขคี่ เห็นได้ชัดว่าพวกมันไม่สามารถส่งคืนไปยังระบบปฏิบัติการได้เนื่องจากรายละเอียดของหน้าคือ 4 KiB ขั้นต่ำบนระบบที่ทันสมัยที่สุด หากคุณจัดสรร 500 MiB เดียวกันใน 1 MiB ชิ้น และปล่อยชิ้นที่เป็นเลขคี่ ชิ้นส่วนเหล่านั้นจะถูกส่งกลับไปยังระบบปฏิบัติการ และการใช้งานหน่วยความจำจะลดลง 250 MiB ตามที่รายงานโดย Activity Monitor (โปรดทราบว่าเกณฑ์ 4 KiB ไม่ใช่เกณฑ์ที่เกิดลักษณะการทำงานนี้ ขึ้นอยู่กับลักษณะการทำงานการจัดสรรที่แน่นอนของ malloc() และพารามิเตอร์บางตัวซึ่งบน OS X ขึ้นอยู่กับ CPU และจำนวน RAM)

อย่างไรก็ตาม มันอาจไม่เกี่ยวข้อง ในแต่ละกรณี หากคุณจัดสรร 250 MiB อีกครั้ง คุณจะกลับมาที่จุดเริ่มต้น การใช้หน่วยความจำส่วนตัวน้อยลงถือเป็นเรื่องดี แต่จะส่งผลต่อประสิทธิภาพของแอปพลิเคชันของคุณร่วมกับผู้อื่นเท่านั้น

person Dietrich Epp    schedule 23.11.2012
comment
ขอบคุณ แต่ฉันไม่แน่ใจว่า macbook ปี 2009 ของฉันทรงพลังพอที่จะรัน Instruments ได้ด้วยซ้ำ ฉันมีอาการกระตุกและส่งพัดลมแล็ปท็อปเข้าสู่โอเวอร์ไดรฟ์เป็นเวลาประมาณ 10 นาทีเพื่อเฝ้าดูการเปิดหน้าต่างเดียว ซึ่งโดยปกติจะใช้เวลาประมาณ 5 วินาทีโดยที่เครื่องมือไม่ทำงาน - person Christian J. B.; 23.11.2012
comment
@ ChristianJ.B.: อืมน่าสนใจ Mac ของฉันจากปี 2005 สามารถทำงานได้ดีพอ... - person Dietrich Epp; 23.11.2012
comment
ฉันกำลังใช้งาน Instruments-> รั่วไหลหากมีความช่วยเหลือใด ๆ - person Christian J. B.; 23.11.2012
comment
@ ChristianJ.B .: ในฐานะเครื่องตรวจจับการรั่วไหลของคนจนคุณสามารถเปิดและปิดหน้าต่างสองสามบานวัดการใช้หน่วยความจำจากนั้นเปิดและปิดหน้าต่างมากขึ้น (แต่ไม่เคยเปิดหน้าต่างเพิ่มในเวลาเดียวกัน) หากการใช้หน่วยความจำเพิ่มขึ้นเรื่อยๆ เมื่อคุณเปิดและปิดหน้าต่าง แสดงว่ามีการรั่วไหล - person Dietrich Epp; 23.11.2012
comment
@ ChristianJ.B.: ถ้าคุณไม่สามารถเรียกใช้ Instruments ได้ฉันก็ไม่รู้จะพูดอะไร ลองถามคำถามว่าทำไมเครื่องตรวจจับการรั่วไหลของเครื่องมือจึงไม่ทำงาน ฉันพบว่าไม่มีประสิทธิภาพลดลงอย่างเห็นได้ชัดเมื่อใช้เครื่องตรวจจับการรั่วไหลกับ MacBook Air รุ่นล่างสุดของฉัน ทุกอย่างราบรื่นเหมือนเช่นเคย - person Dietrich Epp; 23.11.2012
comment
ฉันพบหน้า stackoverflow เกี่ยวกับ Instruments ทำงานช้า ฉันจะพยายามเรียกใช้แยกกัน และไม่โทรจากโปรไฟล์ - person Christian J. B.; 23.11.2012