เนื่องจากข้อจำกับของ iPhone SDK ทำให้ไม่สามารถมี Garbage Collector ได้ ดังนั้นเราจึงต้องมาจัดการในเรื่องการจองและคืนหน่วยความจำเอง
สอง method หลักๆที่เราต้องเรียกในครั้งนี้คือ
1. alloc เทียบได้กับ malloc ใน C
2. dealloc เทียบได้กับ free ใน C โดยเราจะไม่เรียกใช้ตรงๆแต่จะเรียกผ่าน release method
มาดูตัวอย่างกันดีกว่า
1 2 3 | MyClass *myObj = [[MyClass alloc] init]; //Do something with myObj [myObj release]; |
จากตัวอย่างข้างต้น
- เรามีการจองหน่วยความจำด้วย alloc และเรียก init ของ instance นั้น (เทียบได้กับ contructor ใน Java/C++)
- หลังจากเราใช้งาน instance นี้เสร็จแล้ว เราก็ทำการคืนหน่วยความจำด้วยการเรียก release
มาดูในส่วนของ Implementation ของ MyClass บ้างว่าต้องทำอะไร
MyClass.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #import "MyClass.h" @implementation MyClass - (id)init { if (self = [super init]) { //Do init own instances } return self; } - (void)dealloc { //Do release own instances [super dealloc]; } |
จากตัวอย่างข้างต้นเรามี 2 methods คือ
- init ที่ถูกเรียกหลังจากจองหน่วยความจำด้วยการเรียก alloc แล้ว
- และ dealloc ที่จะทำงานเมื่อมีการเรียก release นั่นเอง
ทั้ง 2 methods นั้นเป็นการ override มาจาก Base Class (NSObject) ดังนั้นเราจึงไม่ต้องประกาศใน MyClass.h ส่วน alloc นั้นเราไม่ต้อง implement ครับ
ในคราวหน้าผมจะพูดถึงเกี่ยวกับการใช้ autorelease แทน release ซึ่งจะช่วยลดความสับสนว่าเมื่อไหร่ควรจะเรียก release ครับ
Related posts:
- How to use autorelease in Objective-C and iPhone SDK
- การบันทึก State ของ iPhone App ด้วย NSUserDefaults
Tags: iPhone, Objective-C


[...] เอี้ยก้วย ณ แอนฟิลด์ Write Once, Read Anywhere « Memory Management in Objective-C and iPhone SDK [...]
ขอเสริมนิดนึงครับ การสั่ง release ไม่ใช่การขอคืนหน่วยความจำตรงๆ ครับผม แต่เป็นการลด retain count ของ receiver ครับ หาก retain count ของ receiver เหลือ 0 แล้ว dealloc ถึงจะทำงานครับ
ขอบคุณครับ