Memory Management in Objective-C and iPhone SDK

เนื่องจากข้อจำกับของ 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 ครับ

2 thoughts on “Memory Management in Objective-C and iPhone SDK

  1. ขอเสริมนิดนึงครับ การสั่ง release ไม่ใช่การขอคืนหน่วยความจำตรงๆ ครับผม แต่เป็นการลด retain count ของ receiver ครับ หาก retain count ของ receiver เหลือ 0 แล้ว dealloc ถึงจะทำงานครับ

    ขอบคุณครับ

Leave a Reply

Your email address will not be published. Required fields are marked *