Archive
[Objective-C myNote]
Objective-C เป็น ภาษาที่ใช้เป็นหลักในการพัฒนาโปรแกรมใน MAC และ iPhone
บันทึกนี้เหมาะสำหรับ ท่านที่มีประสบประการณ์ ในการเขียนโปรแกรม แล้วและเข้าใจ object-oriented ดี ไม่เหมาะสำหรับผู้เริ่มหัดเขียนโปรแกรม นะครับ เพราะจะอ่านไม่รู้เรื่อง เอานะครับ ฮะ ฮะ เอิก
เอาว่าถ้า เริ่มศึกษา Objective-C ก็เชิญไปที่นี่ก่อนะครับ Learn Objective-Cหรือว่าที่นี่ก็น่าจะเป็นที่เริ่มต้นได้เป็นอย่างดี ครับ Cocoadevcentrol.com
สำหรับในบทความเล็ก ๆนี้จะ เป็น บันทึกสั้น ๆ ในเรื่องต่าง ของ Objective-C ดังนี้ครับ
- Method
- Accessor
- การสร้าง Objects (Creating Objects)
- การจัดการกับ Memory – Basic Memory Management
- การออกแบบ class interface – Designing a Class interface
- Init
- Dealloc
- การจัดการกับ memory ,Memory Management (เพิ่มเติม)
- Logging
- Properties
- Calling Methods on Nil
- Categories
Method
- การรียกใช้ methods
[ object method];
[ object methodWithInput:input];
- การ return ค่า จาก method
Output = [object methodWithOutput];
Output = [object methodWithInputAndOutput:input];
ข้อสังเกต นะครับการเรียก method คือการส่ง message ให้ object
การเรียก method ของ class เช่น การเรียก string method ของ NSString class ซึ่ง ให้ค่าเป็น
NSString object
id myObject = [NSString string];
id type หมายถึงตัวแปร myObject สามารถอ้างอิงไปยัง object ใด ๆ ประมาณ late binding นะครับ หมายความว่าหากเราเรียก method ที่ NSString ไม่มี ก็ไม่แสดง error ในหว่างทำการ compile
[จากตัวอย่างเป็นวิธีการ สร้าง object ของ Objective-C เขา นะครับ]
NSString* myString = [NSString string];
ครับสำหรับ ตัวอย่างนี้เป็นการ สร้าง object NSString ชี้โดย myString ซึ่งให้เป็น NSString
Compiler จะตรวจสอบได้ หากเรียกใช้ method ที่ไม่มี ใน NSString นะครับ
สังเกตว่า ตัวแปร object ใน Objective-C จะเป็น pointer แต่ id type จากตัวอย่างด้านบนไม่ต้องมี * เพราะมันถูกกำหนดให้เป็น pointer อยู้แล้ว เพราะฉะนั้นไม่ต้องใช้
การเรียก Message แบบ ซ้อน กัน [Nested messages]
[NSString stringWithFormat:[prefs format]];
การเรียก ซ้อนกันก็ไม่ควรเรียกซ้อนกันไม่เกิน 2 message ต่อบรรทัด เพื่อให้สามารถอ่านได้ง่าย
Methods แบบ หลาย Input
เหมือนทั่วไปครับ method สามรถ รับค่าได้ มากกว่า 1 ค่า ใน Objective-C ก็เช่นเดียวกันแต่ Objective-C นั้น ใช้การแตก ชื่อ method ให้เป็นหลาย ๆ ส่วนเพื่อรับข้อมูล หรือ argument ดังตัวอย่าง
การประกาศ :
-(BOOL) writeToFile:(NSString *)path atomatically:(BOOL) usAuxilliaryFile;การเรียกใช้ :
BOOL result = [myData writeToFile:@”/tmp/log.txt” automatically:NO];
ชื่อmethod ก็คือ writeToFile: automatically: ครับ ไม่ใช่ ชื่อ argument นะครับ
Accessor
Instance variable โดย default เป็น private ในการ กำหนดค่า (set) หรือการรับค่า จาก variable จะต้องใช้ accessors สามารถทำได้ดังนี้ครับ
Traditional 1.x sytax
[photo setCaption:@”Day at the Beach”];
Output = [photo caption];
ครับเราจะเห็นว่าการ ใช้งาน accessor นั้น ก็คือการเรียกใช้ method นั่นเอง
จำไว้ว่าเมื่อใดก็ตามที่เห็น code อยู่ใน square brackets หมายถึง เป็นการส่ง message ให้กับ object หรือ class นะครับ
จากตัวอย่าง ที่ บรรทัดที่ 2 caption ไม่ได้ นำด้วย get ใน Objective-C โดยมากจะไม่ใส่ prefix ให้กับ getter ครับ
Dot syntax
สำหรับ dot syntax สำหรับ getter และ setter นั้น เริ่มมีใน Objective-C 2.0 Mac OS X 10.5 เป็นต้นมาครับ
photo.caption = @”Day at the Beach”;
output = photo.caption;
เราเลือกใช้แบบใดก็ได้นะครับ เลือกเอาซะแบบหนึ่ง นะครับ
การสร้าง Objects (Creating Objects)
การสร้าง Object ใน Objective-C สามารถทำได้ 2 วิธี
วิธีแรกเป็นวิธีที่เรา แสดงให้เห็นแล้วก่อนหน้านี้
NSString* myString = [NSString string];
วิธีนี้เป็นแบบ automatic style ครับ สร้างโดยการใช้ autoreleased object ซึ่งจะพูดถึงต่อไป หลังจากนนี้ครับ
อีกวิธีหนึ่ง เรียกว่า manual style คือต้อง ทำ release memory เองหลังจากใช้ object แล้ว ครับ
NSString* myString = [[NSString alloc] init];
จาก code เป็นการเรียก method แบบ ซ้อนกัน (nest)
– Alloc เพื่อ จ้อง memory และ สร้าง object
– Init เป็นการ เรียก method ใน object ที่ถูกสร้างขึ้น มักใช้ในการ กำหนดค่าเริ่มต้นต่าง ๆ ในบางกรณี เราใช้ init ที่รับ input ได้ เช่น
NSString* value = [[NSString alloc] initWithFloat:1.0] ;
การจัดการกับ Memory – Basic Memory Management
ถ้าเรา สร้าง object โดยใช้ alloc อย่างที่กล่าวไป เราต้องทำการ release object หลังจาก ใช้เสร็จ ครับ
ตัวอย่างเช่น
// string1 will be released automatically
NSString* string1 = [NSString string];// must release this when done
NSString* string2 = [[NSString alloc] init];
//..
[string2 release];
การออกแบบ class interface – Designing a Class interface
การสร้าง class มี 2 ส่วนคือ
- Class interface เก็บไว้ใน ClassName.h
- Define instance variable and public methods
- Implementation เก็บไว้ใน ClassName.m
- Actual code
- Private method ซึ่ง ใช้ภายใน
ตัวอย่าง class ชื่อ photo
#import <Cocoa/Cocoa.h> @interface Photo : NSObject { NSString* caption; NSString* photographer; } @end
– ใช้ #import directive เพื่อบอก compiler ว่าจะเรียกใช้ library อะไร
– @interface บอกว่าเป็นการ ประกาศ class ชื่อ photo colon บอกว่า photo มี superclass เป็นอะไร
– ใน curly bracket ประกาศ variable 2 ตัว ชื่อ caption, photographer ซึ่งเป็น NSString
– จบด้วย @end
เอาไว้ต่อกันใน ตอนถัดไปดีไหม ครับ ยาวเกินไปแล้ว
s_teerapong2000@yahoo.com
ธีระพงษ์ ส.