Posts tagged ‘Macbook’

Objective – C Custom Class

ก่อนอื่นขอบอกก่อนนะครับ ว่าหลังจากนี้ ผมจะอิงเนื้อหาจาก CS193P ของ Stanford มาเขียนเป็นบทๆ (เพราะถ้าตั้งหัวข้อเขียนเอง ท่าทางจะงง และจะไม่ครบถ้วน) ถ้าอยากดูสไลด์ประกอบก็ตามในเวบของ CS193P เลยนะครับ

จากก่อนหน้านี้ ผมอธิบายคร่าวๆเกี่ยวกับสิ่งต่างๆที่ต้องรู้ และในหัวข้อ Objective-C ก็อธิบายไว้คร่าวๆเหมือนกัน Entry นี้จะมาเจาะลึกกันซักหน่อย โดยจะเริ่มกันที่เรื่องของ Custom Class ของ Objective-C

ในการสร้าง Custom Class ใน Objective-C ไฟล์ที่ได้จากการสร้าง New Class จะมี 2 ไฟล์ คือไฟล์ .h และ .m
– ไฟล์ .h จะเป็น Header ไฟล์ ที่กำหนดลักษณะทั้งหมดของคลาส ว่า Class Name ชื่ออะไร มี Attribute และ Method อะไรบ้าง นอกจากนั้นยังเป็นส่วนที่กำหนดการเชื่อมต่อกับ Interface Builder ด้วย ลักษณะก็จะเป็นแบบนี้

#import <Foundation/Foundation.h>  // import เหมือนกับคำสั่ง include ของ C/C++

@interface ClassName : NSObject {
// Attribute ของ Class : เขียนเหมือนภาษา C ครับ
// Syntax: datatype varName
id  attr1;
NSString *attr2;

}
// Methods Header : คล้ายๆกับภาษา C เหมือนกันครับ ต่างกันนิดหน่อย
// Syntax: -/+ (returnDatatype)MethodName:(ParameterDatatype)parameterName;
– (void)setAttr2:(NSString *)aValue;
– (Nsstring *)attr2;

@end

– ไฟล์ .m เป็นส่วนของการ Implement Method ของคลาสทั้งหมด ลักษณะก็ประมาณนี้

#import “headerFile.h”

@implementation ClassName

– (void)setAttr2:(NSString *)aValue {
attr2 = aValue;
}

– (NSString *)attr2 {
return attr2;
}

@end

ครับ จากตัวอย่างเป็นการสร้าง Class ที่มี Method Getter กับ Setter นะครับ ต่อไปก็จะเป็นการสร้าง Object, Memory Management และการ ลบ Object นะครับ เริ่มต้นที่การสร้าง Object

การสร้าง Object มีสองขั้นตอนคือ การจองพื้นที่ และ การกำหนดค่าตั้งต้นของ Object ซึ่งรูปแบบมีดังนี้

ObjectClass *ObjectName = [[ObjectClass alloc] init];

การกำหนดค่าตั้งต้นอาจจะมี Parameter อื่นๆได้ด้วย ในกรณีตัวอย่างหมายถึง Default การกำหนดนี้ จะเกี่ยวข้องกับ Memory Management ตรงที่ Object ที่ถูกประกาศ จะมี retain count เป็น 1 หมายความว่า ตราบใดก็ตามที่ Object ตัวนี้ยังมีค่า retain count เป็น 1 หมายความว่า object ตัวนี้จะยังคงอยู่ในหน่วยความจำไปเรื่อยๆ ถ้าเราต้องการลบ Object ตัวนี้เราก็ทำได้โดยการใช้คำสั่ง Release แบบนี้ครับ

[ObjectName release];

ซึ่งจากข้างต้น ให้พูดง่ายๆก็คือ malloc กับ free ในภาษา C นั่นแหละครับ

แล้วก็อย่างที่บอกก่อนหน้านี้ครับ หลังจาก Mac OS X ออกมาเป็นเวอร์ชั่น 10.5 Leopard สิ่งที่คลานตามออกมาด้วยกัน คือ Objective-C 2.0 หลักๆก็มีสามอย่างอย่างที่เคยบอกนะครับ แต่Entry นี้จะเน้นเรื่อง Property แค่เรื่องเดียว เพราะเป็นเรื่องสำคัญใน iPhone Development เลยทีเดียว

Property เป็นสิ่งที่เข้ามาช่วยกำหนดคุณลักษณะของ Attribute ของ Class ของเราครับ ว่ามันอยู่ในหน่วยความจำอย่างไร Access ค่าแบบไหน ถามว่ามันจะรู้ไปทำไมว่าอยู่ในหน่วยความจำอย่างไร (retain, assign, copy) ก็เพราะฟีเจอร์เกี่ยวกับ Garbage Collector ส่วนเรื่อง Access ค่าอย่างไร (readwrite, readonly) ก็เป็นเรื่องที่เกี่ยวกับการใช้งานฟีเจอร์สร้าง Method Getter/Setter อัตโนมัติของ Property เอง (มันจะสร้างแบบไหนก็เกี่ยวกับมันอยู่ในหน่วยความจำอย่างไรเช่นกัน)

ส่วนว่าแต่ละอย่างมันหมายความว่ายังไงบ้าง ก็หมายความอย่างนี้ครับ

retain – Attribute นั้นถูกประกาศขึ้นโดย retain Count เป็น 1 Value เป็น default

assign – Attribute นั้นเป็น Pointer ชี้ไปที่ Attribute อื่นอีกทีนึง

copy – Attribute นั้น Access ค่าโดยการ Copy ค่ามาจากที่อื่น แต่ไม่ได้เพิ่ม retain count ขึ้นมาด้วย

readonly, readwrite – เป็นตัวกำหนดการ Access Attribute ว่าให้อ่านอย่างเดียวหรือเขียนได้ด้วย

ซึ่งตัวอย่างการใช้งานก็จะเปลี่ยนจากตัวอย่างด้านบนมาเป็นลักษณะนี้ครับ

ไฟล์ Header

#import <Foundation/Foundation.h>

@interface ClassName : NSObject {
id  attr1;
NSString *attr2;
}
@property id attr1;
@property Nsstring *attr2;

@end

ไฟล์ Implement

#import “headerFile.h”

@implementation ClassName

@synthesis attr1;
@synthesis attr2;

@end

จะเห็นว่า Method Getter/Setter หายไปและแทนที่ด้วยการกำหนด property แทน และในส่วนของ implement ก็แค่ใช้คำสั่ง @synthesis <#attribute> เพื่อให้มันสร้าง Method Getter และ Setter ขึ้นมา สั้นและง่ายขึ้นเยอะเลยใช่มั้ยครับ

ส่วนเรื่องการใช้งาน จะใช้ dot syntax เข้ามาแทนการเข้าถึง attribute ที่กำหนด property ครับ ลักษณะก็เป็นแบบนี้ (ใช้ class จากตัวอย่างข้างต้น)

objectExample.attr2 = @”test String”;  // อันนี้เป็นกรณี Setter method

NSLog(@”%@”, objectExample.attr2);  // อันนี้เป็นกรณีของ Getter method

ไม่ยากเกินไปใช่มั้ยครับ เกี่ยวกับเรื่องของ Custom Class ใน Objective-C สำหรับเนื้อหา Entry นี้อ้างอิง CS193P : Chapter 3 Custom Class นะครับ อยากดูสไลด์ก็ไปดูได้ (แต่ผมไม่ได้ทำหรอกนะ) เข้าใจไม่เข้าใจยังไงก็ติชมได้ครับ สำหรับบทนี้ขอจบเท่านี้ครับ

มีนาคม 6, 2009 at 10:04 am 2 ของความคิดเห็น

เรื่องตลกของไวร์เลสที่ออฟฟิศ

ช่วงนี้ไม่ค่อยได้แวะเข้ามาเขียนบลอกเลย เนื่องจากงานเข้า(เข้ามาบ้างก็ดี เพราะว่างมานานแล้วเหมือนกันนะ)

อย่างว่าครับ ระหว่างที่ทำงานอยู่ที่บริษัท และยกจอ Monitor มาพวกกับ Notebook เพื่อจะใช้สองจอ (สะดวกในการเขียนโปรแกรมดีครับ) หลังจากต่อเสร็จสรรพเรียบร้อยแล้ว ก็เกิดสิ่งประหลาดขึ้นกับเครืองของผม 

MSN เริ่มติดๆหลุดๆ เวบเริ่มเข้าได้บ้างไม่ได้บ้าง จนในที่สุดก็ใช้เนตไม่ได้ (ทั้งที่คนอื่นเขาใช้กันได้ทั้งบริษัท)

ผมก็ทนกับอาการบ้าๆบอๆนี้ไปวันนึง (วันนั้นหงุดหงิดทั้งวันเลย เพราะนอกจากจะงานไม่เดินแล้วยังเล่นเอ็มไม่ได้อีก เอิ๊กๆ) แล้วก็กลับไปเล่นเนตที่หอซะให้สะใจ

…วันถัดมา (หมายถึงวันนี้) ผมต่อเครื่องเตรียมทำงานตามปกติ และแล้วอาการบ้าบอก็เกิดขึ้นอีกครั้ง เนตเฮงซวยอีกแล้ว ถ้าเล่นเนตไม่ได้ผมจะหาข้อมูลมาทำงานยังไง งานไม่เดินอีกวันแน่ๆ เอาวะ ผมตัดสินใจเอาปัจจัยที่ส่งผลมากที่สุดกลับออกไป ก็เจ้า Monitor ที่ผมยกมาใช้นั่นแหละครับ

ไม่เห็นจะน่าเกี่ยวกันยังไง แต่ติดครับ Internet ผมกลับมาใช้ได้ตามปกติ!!!

แค่นี้ยังไม่พอ หลังจากทำงานซักพักและพี่เดฟก็เข้ามาที่ออฟฟิศ ผมลองเล่าให้ฟังและพี่เดฟก็ลองเอาเครื่องออกไปห่างๆจอภาพบนโต๊ะ สัญญาณไวร์เลสพุ่งกระฉูดเลยครับ เต็ม 5 ขีดเลยทีเดียว

ผมก็เลยจำใจทำงานไปด้วยจอเดียวด้วยเหตุประการนี้แล

สิงหาคม 6, 2008 at 7:54 am 1 ความเห็น


del.icio.us For iPhone dev

Post Calendar

ตุลาคม 2019
พฤ อา
« ธ.ค.    
 123456
78910111213
14151617181920
21222324252627
28293031