ถ้าหลังจากที่ได้เขียนเกี่ยวกับ ภาษา Objective-c มาล้วนๆ และก็ได้พอขึ้น cocoa กับ iphone ไปบ้าง แต่ว่ามันก็ยังมีบางเรื่องที่ผมคิดว่า ต้องเขียนก่อน นั่นก็คือ Objective C 2.0 นั่นเอง
Objective-C 2.0 ต่างจาก Objective-C หรือเปล่า ?
คำตอบก็คือ มันก็ไม่ได้ต่างหรอกครับ เพียงแค่เค้าเพิ่มบางอย่างในตัวภาษาเข้ามา อาทิเช่น Garbage Collection อะไรแบบนี้เป็นต้น ฉนั้นแล้วก็ไม่ต้องไปกังวล ว่านี่ต้องศึกษาใหม่เลยหรือเปล่า และในวันนี้ผมจะ เริ่มด้วย คุณสมบัติใหม่ๆที่เพิ่มเข้ามาของ objective-c 2.0 ซึ่งมันจะช่วยอำนวยความสะดวกมากๆ ต่อการเขียนโปรแกรม งั้นเรามาเริ่มเลยดีกว่า
@property
เป็นคุณสมบัติที่เพิ่มเข้ามาใน objective-c 2.0 นี้ โดยปกติแล้ว เมื่อเราประกาศ member ใน class แล้วเราก็มักจะมี Function Get/Set กับตัวแปรนั้นๆเช่นว่า
// Student.h @interface Student : NSObject { int score; } -(int) getScore; -(void) setScore:(int) n; @end
ส่วนตัว source file ก็เขียนได้ว่า
// Student.m @implementation Student -(int) getScore { return score; } -(void) setScore:(int) n { score = n; } @end
ในตัวโปรแกรมอาจจะมีการเรียกใช้ เช่น
x = [student getScore]; [student setScore:80];
จะเห็นว่า ยังไงเราก็ไม่สามารถเข้าไปใช้ score ได้ตรงๆ ต้องเรียกผ่าน getScore / setScore แต่ใน objective-c 2.0 นั้นเราไม่จำเป็นต้องเขียน set/get ก็ได้ โดยสิ่งที่เราจะทำก็คือ ทำให้ score นั้นเป็น property ของ class-Student ซะเลย
วิธีการก็ไม่ได้ยากเย็นอะไรนัก สิ่งที่ต้องทำก็คือ บอกว่า member นั้นเป็น property ดังตัวอย่าง code ข้างล่างนี้
@interface Student : NSObject { int score; } @property (assign) int score; @end
ส่วนของ code เราก็เพียงแค่เขียน synthesize เข้ามา
@implementation Student @synthesize score; @end
เพียงเท่านี้ก็เรียบร้อย ส่วนวิธีการก็คือ เรียกผ่านเครื่งหมาย “.” เช่นตัวอย่างแบบนี้
x = student.score; student.score = 40;
จะเห็นว่ามันช่วยลดการเขียน set/get ลงไปได้เยอะเลย ลองนึกว่า หาเรามี member สัก 20 ตัวและต้องเขียน set/get นี่ก็คงต้องเขียนทั้งหมด 40 method เลยทีเดียว
Attributes
จาก code ที่ผ่านมาจะเห็นว่า เราได้เขียน property กันไปแล้ว จะเห็นว่ามี keyword – assign อยู่ เช่น
@property (assign) int a;
keyword เหล่านี้เป็นตัวกำหนดลักษณะของ property ต่างๆว่ามีลักษณะเช่นไร และลักษณะต่างๆ ก็แบ่งออกได้เป็น
Setter Attribute ได้แก่
- assign
โดยปกติแล้วจะถูกกำหนดมาให้เป็น default อยู่แล้ว - retain
จะทำการ release ค่าที่เก็บไว้ก่อน แล้วหลังจากนั้นจะ retain ค่าใหม่ - copy
จะทำการ release ค่าที่เก็บไว้ก่อน แล้วหลัวจากนั้นจะ copy ค่าใหม่เข้ามา โดยปกตินิยมใช้กับ string
เราอาจจะไม่กำหนด attribute แต่ถ้าหากว่าเราไม่ได้ใช้งาน Garbage Collection นั้นเราต้องเลือกใช้อย่างใดอย่างหนึ่ง
Writability Attribute
- readonly
ถ้าหากเรากำหนดเป็นแบบนี้ ตัว compiler จะไม่สร้าง setter ให้เรา - readwrite
วิธีการใช้ก็คือ ใช้เครื่องหมาย “,” คั่น ระหว่าง attribute ต่างๆเช่น
@property (assign,readonly) int a;
Atomic Attribute
- nonatomic
โดยปกติจะเป็น atomic
แล้ว atomic กับ nonatomic ต่างกันยังไง ?
ถ้าหากเป็น atomic นั้นแต่ละ Thread จะเข้าไปเปลี่ยน ค่าใน property พร้อมๆกันไม่ได้ เพราะว่าจะทำการ Lock ค่าไว้และเมื่อเปลี่ยนแปลงค่าเสร็จเรียบร้อยแล้วถึงจะ Unlock ให้ thread อื่นเข้าไปใช้ ก็ถ้าเราใช้ nonatomic ก็จะไม่มีการ lock
@synthesize @dynamic
โดยปกติแล้วเราจะใช้ synthesize เพราะว่ามันจัดการ เขียน setter/getter ให้เรา แต่เรายังอาจจะเขียน setter/getter เองก็ได้ วิธีการก็คิือ ใช้ @dynamic แทน โดยลักษณะของ code จะเป็นประมาณนี้
// ClassA.h @interface ClassA : NSObject { NSString *dynamicValue; NSString *synthesizeValue; } @property(copy, readwrite) NSString *dynamicValue; @property(assign) NSString * synthesizeValue; @end // ClassA.m @implementation ClassA @dynamic dynamicValue; @synthesize synthesizeValue; - (NSString *)dynamicValue { return dynamicValue; } - (void)setdynamicValue:(NSString *)newValue { if (newValue != dynamicValue) { dynamicValue = [newValue copy]; } }
ครั้งหน้ามาต่อด้วย Objective-C 2.0 อีกครั้ง



anuchiit says:
@property (nonatomic,retain)
September 2, 2009, 2:16 amความหมายของตัวนี้คืออะไรหรอครับ
เท่าที่อ่านดูช่วยยกตัวอย่างการทำงานจริงให้ดูหน่อยซักนิดได้ไหมครับที่บอกว่า
nonatomic มันจะไม่ Lock Thread น่ะครับ คืองงว่ามันใช้กับเรื่อง Thread หรือเปล่า
anuchiit says:
@property (nonatomic,retain)
ความหมายของตัวนี้คืออะไรหรอครับ
เท่าที่อ่านดูช่วยยกตัวอย่างการทำงานจริงให้ดูหน่อยซักนิดได้ไหมครับที่บอกว่า
nonatomic มันจะไม่ Lock Thread น่ะครับ คืองงว่ามันใช้กับเรื่อง Thread หรือเปล่า
ขอบคุณครับ
September 2, 2009, 2:16 am