Objective-C 2.0 Programming : Property

ถ้าหลังจากที่ได้เขียนเกี่ยวกับ ภาษา 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 อีกครั้ง

Technorati Tags: ,


2 responses so far, want to say something?

  1. Avatar

    anuchiit says:

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

  2. Avatar

    anuchiit says:

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

    ขอบคุณครับ

Leave a Reply

You must be logged in to post a comment.


5

.

.

1300


.

Total Health Makeover