How to use autorelease in Objective-C and iPhone SDK

จากคราวที่แล้วที่ผมพูดเกี่ยวกับ Memory Management in Objective-C and iPhone SDK ด้วยการใช้ alloc และ release

วันนี้เราจะมาดูกันว่าวิธีการใช้ autorelease นั้นดีกว่ายังไง

เดิมนั้นในการสร้าง instance จาก Class นั้นเราจะเขียน code ประมาณนี้

1
2
3
MyClass *myObj = [[MyClass alloc] init];
//Do something with myObj
[myObj release];

โดย alloc เป็น class method (เทียบได้กับ static method ใน Java/C++) ทำหน้าที่สร้าง instance เปล่าๆขึ้นมา
ส่วน init เป็น instance method ทำหน้าที่กำหนดค่าเริิ่มต้นให้กับ instance นั้น

เราจะดัดแปลงการสร้าง instance ของ MyClass ให้มีประสิทธิภาพมากขึ้นดังนี้
- ไม่ต้องมีการเรียกใช้ alloc และ release
- เปลี่ยนจากการเรียกใช้ init ที่เป็น instance method ไปเป็นการเรียกใช้ class method เพื่อสร้างและกำหนดค่าเริ่มต้นให้กับ instance พร้อมๆกัน

โดย Code ที่จะเรียกใช้จะเป็นดังนี้

1
MyClass *myObj = [MyClass getInstance];

จะเห็นว่าไม่มีการเรียกใช้ alloc, release และเปลี่ยนการเรียก init มาเป็น getInstance แทน (ชื่อ getInstance เป็นชื่อที่เรากำหนดได้เอง)

มาดูในส่วนของ Implementation ของ MyClass บ้างว่าต้องแก้ไขอย่างไร

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#import "MyClass.h"
@implementation MyClass
 
+ (MyClass *)getInstance {
	MyClass *myObj = [[MyClass alloc] init];
	[myObj autorelease];
	return myObj;
}
 
- (id)init {
	if (self = [super init]) {
		//Do init own instances
	}
	return self;
}
 
- (void)dealloc {
	//Do release own instances
	[super dealloc];
}
@end

ส่วนที่เราเพิ่มเข้าไปในบรรทัดที่ 4-8 คือ
- การ implement method ที่ชื่อ getInstance โดยการทำงานคือ encapsulate ในส่วนของการเรียก alloc และ init ที่ก่อนหน้านี้ถูกเรียกอยู่ภายนอก
- แทนการเรียกใช้ release ด้วย autorelease

โดยใน MyClass.h เราต้องมีการประกาศ getInstance ด้วย เนื่องจากเป็น method ใหม่ที่เรากำหนดขึ้นมาเอง

สรุปได้ว่าเราใช้ getInstance ข้างต้นเพื่อ encapsulate การจองและคืนหน่วยความจำนั่นเอง

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

1
+ (MyClass *)getInstanceWithName:(NSString *)name;

วิธีข้างต้นเป็น Best Practice ที่ใช้กันอย่างแพร่หลายใน Class มาตรฐานของ Obejctive-C เช่น NSString ที่มี method ที่ใช้สร้าง instance ชื่อ string และ stringWithFormat เป็นต้น

Related posts:

  1. Memory Management in Objective-C and iPhone SDK
  2. การบันทึก State ของ iPhone App ด้วย NSUserDefaults

Tags: ,

Leave a Reply