เนื่องจากข้อจำกับของ 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
ครับ
ขอเสริมนิดนึงครับ การสั่ง release ไม่ใช่การขอคืนหน่วยความจำตรงๆ ครับผม แต่เป็นการลด retain count ของ receiver ครับ หาก retain count ของ receiver เหลือ 0 แล้ว dealloc ถึงจะทำงานครับ
ขอบคุณครับ