อะไรคือสิ่งที่-(void)viewDidUnload
ดี?
ฉันไม่สามารถเชื่อมโยงทุกอย่างได้-dealloc
หรือไม่? ถ้ามุมมองยกเลิกการโหลดจะไม่-dealloc
ถูกเรียกใช่ไหม
อะไรคือสิ่งที่-(void)viewDidUnload
ดี?
ฉันไม่สามารถเชื่อมโยงทุกอย่างได้-dealloc
หรือไม่? ถ้ามุมมองยกเลิกการโหลดจะไม่-dealloc
ถูกเรียกใช่ไหม
คำตอบ:
-viewDidUnload
นอกเหนือไปจากสิ่งที่ได้รับการระบุไว้แล้วผมอยากจะอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับตรรกะที่อยู่เบื้องหลัง
เหตุผลที่สำคัญที่สุดประการหนึ่งในการนำไปใช้คือUIViewController
คลาสย่อยมักจะมีการอ้างอิงถึงมุมมองย่อยต่างๆในลำดับชั้นของมุมมอง คุณสมบัติเหล่านี้จะได้รับการตั้งค่าผ่านIBOutlets
เมื่อโหลดจากปลายปากกาหรือโปรแกรมภายใน-loadView
เช่น
ความเป็นเจ้าของเพิ่มเติมของUIViewController
มุมมองย่อยโดยวิธีการที่แม้ว่ามุมมองจะถูกลบออกจากลำดับชั้นของมุมมองและปล่อยออกมาเพื่อบันทึกหน่วยความจำซึ่งมุมมองย่อยจะถูกปล่อยออกมาโดยมุมมองด้วยเช่นกันพวกเขาจะไม่ถูกยกเลิกการจัดสรรเนื่องจากUIViewController
ตัวมันเองยังคงมีความโดดเด่นของตัวเอง การรักษาการอ้างอิงถึงวัตถุเหล่านั้นด้วย การปล่อยความUIViewController
เป็นเจ้าของเพิ่มเติมของอ็อบเจ็กต์เหล่านี้ทำให้มั่นใจได้ว่าอ็อบเจ็กต์เหล่านี้จะถูกยกเลิกการจัดสรรเช่นกันเพื่อเพิ่มหน่วยความจำ
วัตถุที่คุณปล่อยที่นี่มักจะมีการสร้างและการตั้งค่าอีกครั้งเมื่อUIViewController
มุมมองเป็นอย่างใดอย่างหนึ่งจากปลายปากกาหรือผ่านการดำเนินการของre-loaded
-loadView
นอกจากนี้โปรดทราบว่าUIViewController
view
สถานที่ให้บริการอยู่nil
ในเวลาที่เรียกวิธีนี้
ตามเอกสารระบุว่า :
เรียกว่าในช่วงสภาวะหน่วยความจำเหลือน้อยเมื่อตัวควบคุมมุมมองจำเป็นต้องปล่อยมุมมองและวัตถุใด ๆ ที่เกี่ยวข้องกับมุมมองนั้นเพื่อเพิ่มหน่วยความจำ
ในสถานการณ์เดียวกันdealloc
จะไม่ถูกเรียก วิธีนี้ใช้ได้เฉพาะใน OS3 ขึ้นไป การรับมือกับสถานการณ์เดียวกันใน iPhone OS 2.x เป็นความเจ็บปวดอย่างแท้จริง!
อัปเดตกรกฎาคม 2015 : ควรสังเกตว่าviewDidUnload
เลิกใช้งานแล้วใน iOS 6 เนื่องจาก "มุมมองไม่ได้ถูกลบอีกต่อไปภายใต้สภาวะหน่วยความจำต่ำดังนั้นจึงไม่เรียกวิธีนี้" dealloc
ดังนั้นคำแนะนำที่ทันสมัยไม่ได้ที่จะต้องกังวลเกี่ยวกับเรื่องนี้และการใช้งาน
เนื่องจากโดยทั่วไปคุณจะตั้งค่า@property
เป็น"(nonatomic, retain)"
และเป็นเช่นนั้นตัวตั้งค่าที่สร้างขึ้นเพื่อให้คุณเผยแพร่วัตถุปัจจุบันจากนั้นจะคงอาร์กิวเมนต์ไว้คือ
self.property = nil;
... ทำอะไรบางอย่างตามแนวของ:
[property release];
property = [nil retain];
ดังนั้นคุณจึงฆ่านกสองตัวด้วยหินก้อนเดียว: การจัดการหน่วยความจำ (ปล่อยวัตถุที่มีอยู่) และกำหนดตัวชี้เป็นศูนย์ (เนื่องจากการส่งข้อความใด ๆ ไปยังตัวชี้ศูนย์จะส่งกลับศูนย์)
หวังว่าจะช่วยได้
โปรดจำไว้ว่าviewDidUnload
เป็นวิธีการในตัวควบคุมมุมมองไม่ใช่ในมุมมอง มุมมองของ dealloc
วิธีการที่จะได้รับการเรียกเมื่อมุมมอง unloads แต่ควบคุมมุมมองของ dealloc
วิธีการอาจจะไม่ได้เรียกว่าจนกระทั่งต่อมา
หากคุณได้รับคำเตือนหน่วยความจำเหลือน้อยและมุมมองของคุณไม่แสดงขึ้นซึ่งจะเกิดขึ้นเช่นเมื่อใดก็ตามที่คุณใช้ UIImagePickerController เพื่อให้ผู้ใช้ถ่ายภาพมุมมองของคุณจะถูกยกเลิกการโหลดและจะต้องโหลดซ้ำหลังจากนั้น
สรุป:
View Controllers มีคุณสมบัติมุมมอง โดยทั่วไปแล้วปลายปากกาหรือชิ้นส่วนของโค้ดจะเพิ่มมุมมองอื่น ๆ ให้กับมุมมองนี้ สิ่งนี้มักเกิดขึ้นภายในเมธอด -viewDidLoad เช่นนี้:
- (void)viewDidLoad {
[super viewDidLoad];
[self createManyViewsAndAddThemToSelfDotView];
}
นอกจากนี้ไฟล์ nib อาจสร้างปุ่มและต่อท้ายเข้ากับมุมมองของตัวควบคุมมุมมอง
บน iPhone OS 2.2 เมื่อเรียกใช้ -didReceiveMemoryWarning จากระบบคุณต้องปล่อยบางสิ่งเพื่อเพิ่มหน่วยความจำ คุณสามารถปล่อยมุมมองของตัวควบคุมมุมมองทั้งหมดได้หากเหมาะสม หรือเนื้อหาที่ใช้หน่วยความจำขนาดใหญ่ในนั้น
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}
ตอนนี้ใน OS 3.0 ใหม่มีเมธอด -viewDidUnload ซึ่งจะเรียกใช้จากระบบเมื่อมุมมองถูกยกเลิกการโหลดเนื่องจากหน่วยความจำเหลือน้อย (โปรดแก้ไขฉัน: เมื่อใดที่สิ่งนี้ถูกเรียกว่า?)
-viewDidUnload ใช้เพื่อปล่อยอ็อบเจ็กต์ทั้งหมดที่เป็นของทั้งตัวควบคุมมุมมองและมุมมอง เหตุผล: หากตัวควบคุมมุมมองมีการอ้างอิงถึงชายด์ของมุมมองเช่นปุ่มมุมมองย่อยที่อ้างอิงจะไม่ถูกปล่อยเนื่องจากจำนวนการเก็บรักษาคือ> = 1 หลังจากที่ปล่อยใน -viewDidUnload พวกเขาจะได้รับอิสระ จากความทรงจำ.
Apple เลิกใช้ viewWillUnload ตอนนี้คุณใช้ didReceiveMemoryWarning หรือ dealloc เพื่อปล่อย objetcs ของคุณ
ใน iOS 6 เมธอด viewWillUnload และ viewDidUnload ของ UIViewController ได้เลิกใช้แล้ว หากคุณใช้วิธีการเหล่านี้เพื่อปล่อยข้อมูลให้ใช้เมธอด didReceiveMemoryWarning แทน คุณยังสามารถใช้วิธีนี้เพื่อปล่อยการอ้างอิงไปยังมุมมองของตัวควบคุมมุมมองหากไม่ได้ใช้ คุณจะต้องทดสอบว่ามุมมองไม่ได้อยู่ในหน้าต่างก่อนที่จะดำเนินการนี้
หากตัวควบคุมมุมมองถูกดึงออกมาจากสแต็กตัวควบคุมการนำทางและไม่ได้ถูกเก็บไว้ที่อื่นจะถูกยกเลิกการจัดสรรและจะเรียกใช้ dealloc แทน viewDidUnload คุณควรปล่อยมุมมองที่สร้างขึ้นใน loadView ใน dealloc แต่ไม่จำเป็นต้องตั้งค่าตัวแปรเป็นศูนย์เพราะไม่นานหลังจาก dealloc ถูกเรียกว่าตัวแปรจะไม่มีอยู่อีกต่อไป
คุณสามารถเผยแพร่มุมมองย่อยใด ๆ ที่คุณมีอยู่เช่น UIImageView ที่คุณเก็บไว้ในเมธอด loadView หรือดีกว่า แต่รูปภาพที่อยู่บน UIImageView นั้น