Home > Objective-C > Objective-C Note ภาคต่อ 3

Objective-C Note ภาคต่อ 3

ใกล้หมดแล้วครับมาต่อกันเลย

ความเข้าใจในการใช้ nil [ Calling methods on Nil]

ใน Objective-C นั้น nil object นั้นมี การทำงานเหมือน NULL pointer ในหลายๆ ภาษาที่แตกต่างไปก็คือเราสามารถ เรียก method ของ nil object โดยไม่ทำให้โปรแกรมล่มหรือทำให้เกิด exception ได้ [” จิงดิ “]

เทคนิคนี้ถูกนำไปใช้ใน Frameworks หลากหลายวิธีการ แต่ความหมายที่ต้องการให้ทราบก็คือในขณะนี้ก็คือเราไม่จำเป็นต้องตรวจสอบ object ก่อนการเรียกใช้ method ว่า object นั้น จะเป็น nil หรือไม่ หากเราเรียก method ของ nil object จะได้ค่า nil เป็นค่า return

เราลองมาดูการปรับปรุง dealloc ให้ดีขึ้นอีกนิส

-(void) dealloc
{
	self.caption = nil; 
	self.photographer = nil;
	[super dealloc];
}

code ส่วนนี้ทำงานได้เนื่องจากเมื่อเรากำหนดค่า nil ให้ instance variable setter จะทำการ retain ค่า nil (แปลว่าว่างเปล่า)และreleaseค่าเก่าออกด้วยวิธีการนี้จะทำให้ variable หมดโอกาสที่จะชี้สุ่มไป เรื่อยเปื่อย

การที่เราใช้ รูปแบบ self. ก็หมายถึงเรากำลังใช้ setter และให้ memory management ของระบบ จัดการเรื่องการคืน memory ถ้าหากเราใช้แบบกำหนดค่าให้โดยตรง(ตัวอย่าง codeด้านล่าง) จะทำให้เกิด memory leak ได้

// incorrect. Causes a memory leak.
// use self.caption to go through  setter 
 
caption = nil;

Categories

categories เป็น คุณลักษณะที่สำคัญอีกอันหนึ่งของ Objective-C โดยที่ Categories นั้นจะทำให้เราสามารถที่จะเพิ่ม method ให้กับ class ที่มีอยู่โดยที่ไม่ต้องทำ sublassing หรือ รู้รายละเอียดเกี่ยวกับการ implementation ของ class นั้น ๆ เลย
ถือว่ามีประโยชน์มากเนื่องจากเราสามารถที่เพิ่ม method ให้กับ built-in object( object ของ class ใน framework ของ cocoa เอง ) เช่นหากเราต้องการเพิ่ม method ให้กับ instance ของ NSString ใน application ที่เรากำลังทำอยู่ เราแค่เพิ่ม category. เราไม่จำเป็นต้องรู้ทุกอย่างเพื่อทำ subclass ขึ้นมา

ตัวอย่าง ถ้าต้องการเพิ่ม method ให้กับ NSString เพื่อใช้ตรวจสอบว่า string ที่กำหลดให้ขณะนั้นเป็น URL หรือไม่ หน้าตาของมัน จะประมาณนี้ครับ

#import 

@interface NSString (Utilities)
-(BOOL) isURL;
@end

จะเห็นว่าหน้าตาเหมือนการประกาศ class จะต้องบอกสักนิสว่า method นี้ใช้แสดงให้เห็นการทำ category เท่านั้นให้ดูเท่านนั้นไม่ใช้ method สำหรับการตรวจสอบ URL ที่ดีเลยไม่ควรเอาไปใช้จิงนะครับ

ครับมาดูว่าเราจะ implement อย่างไร

#import “NSString-Utilities.h”

@implementation NSString (Utilitites)

-(BOOL) isURL
{
	if([Self hasPrefix:@”http://”])
		return YES;
	else
		return NO;
}

@end

ครับตอนนี้เรามาลองดูการใช้งานว่าเป็นอย่างไร

NSString* string1 = @”http://pixar.com/”;
NSString* string2 = @”Pixar”;

if([string1 isURL])
	NSLog(@”string1 is a URL”);

if([string2 isURL])
	NSLog(@”string2 is a URL”);

ต่างกับ subclass นะครับ category ไม่สามารถ เพิ่ม instance variable ได้ อีกอย่างหนึ่งที่สามารถทำได้คือเราสามารถใช้ category ในการ override method ที่มีอยู่ได้ แต่ต้องทำอย่างระมัดระวังอย่างมากมาย

จะบอกว่าเนื้อหาในเรื่อง Obective-c Mynote จบลงตรงนี่ครับ เรื่องที่กล่าวมาทั้งหมดนั้นอ้างอิง หรือ แปลจาก http://www.cocoadevcentral.com เพื่อน ๆ สามารถหาอ่านเพิ่มเติมได้ที่นี่และ ค้นหาได้ใน internet

ในเรื่องของการเขียนโปรแกรมกับ Objective-c นั้นส่วนต้วผมเป็นเรื่อสนุกและท้าทายนะครัย ที่กล่าวมาทั้งหมดนั้นเป็นพื้นฐานของการเขียนObjective-c เรายังต้องเรียนรู้เพิ่มอีกในเรื่องของ cocoa (เขาออกเสียงว่า โกโก้ หรือปล่าวไม่รู้นะ) และ cocoa graphic
Cocoa นั้นเป็นกลุ่มของ Framework ซึ่งประกอบด้วย Foundation, AppKit และ CoreData เป็นต้น จะช่วยให้เราพัฒนา application ให้กับ MAC OS X ซึ่งเป็นที่ทราบกันว่าเทคโนโลยีบางส่วน นั้นสืบทอดมากจาก NeXTSTEP operating system ครับค่อยพูดกันในรายละเอียดใน บทความ ต่อ ๆอีกก็แล้วกันนะครับ

ธีระพงษ์ สนธยามาลย์
s.teerapong@gmail.com

Categories: Objective-C Tags: ,
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: