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