Archive

Archive for August 19, 2012

[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

ธีระพงษ์ ส.

Categories: Objective-C