Tag Archives: NSDictionary

Objective-C Programming Chapter 16 (Part2)

ARC

 

วิวัฒนาการในการจัดการหน่วยความจำของภาษา Objective-C ได้เริ่มมาตั้งแต่การใช้ reference counting หรือการนับจำนวน release , retain ต่อมาก็มี autorelease pool และ garbage collector (gc) แต่โปรแกรมเมอร์ก็ยังประสบปัญหาในการจัดการหน่วยความจำอยู่ เช่น จำนวนของ release และ retain นั้นไม่เท่ากัน ซึ่งพบได้บ่อยในผู้ที่เริ่มเขียนโปรแกรมด้วยภาษา Objective-C นอกจากปัญหาเหล่านี้แล้ว เมื่อประกาศอ็อบเจ็กยังต้องพิจารณาอีกว่าอ็อบเจ็กควรจะมีการจัดการหน่วยความจำเป็นแบบ autoreleased หรือไม่ เช่น ควรประกาศสตริงด้วย [[NSString alloc] initWith.. ] หรือจะใช้ [NSString stringWith… ] เป็นต้น ตัวเลือกอื่นในการจัดการปัญหาก็คือ garbage collector แต่ผลที่ตามมาก็คือประสิทธิภาพลดลง และ ไม่สามารถใช้กับ iOS ได้ เพื่อแก้ปัญหานี้ Apple ก็ได้ออกเครื่องมือ ช่วยเหลือให้นักพัฒนาได้ใช้ตรวจสอบหน่วยความจำของโปรแกรม เช่น Static Analyzer และ Instrument แต่อย่างไรก็ตามนักพัฒนาโปรแกรมก็ยังต้องจัดการปัญหาหน่วยความจำนี้ ด้วยตัวเองเช่นเดิม แต่ปัญหาเหล่านี้จะหมดไปเพราะ llvm ได้เพิ่มวิธีการจัดการหน่วยความจำแบบใหม่ ที่สะดวกเหมือน garbage collector และยังมีประสิทธิเหมือนการใช้ reference counting นั่นก็คือ Automatic Reference Counting หรือเขียนย่อๆได้ว่า ARC

ARC คือการมอบหมายให้คอมไพลเลอร์เป็นคนจัดการระบบ reference counting แม้ว่าจะเป็นการจัดการแบบอัตโนมัติเช่นเดียวกับ garbage collector แต่การทำงานนั้นแตกต่างกัน เพราะการจัดการหน่วยความจำด้วย garbage collector นั้นจะทำงานในแบบ runtime ทำให้คอมไพลเลอร์ต้องรวมเอา garbage collector เป็นส่วนหนึ่งของโปรแกรม และนั่นเป็นสาเหตุทำให้โปรแกรมทำงานช้า เพราะมี garbage collector ทำงานอยู่อยู่เบื้องหลังตลอดเวลานั่นเอง แต่ในทางกลับกัน การทำงานของอาร์คจะเกิดขึ้นตอน compile time เพราะสิ่งที่อาร์คทำคือวิเคราะห์และจัดการเพิ่มโค้ดส่วนของ retain,release ให้กับอ็อบเจ็กโดยอัตโนมัติ ดังนั้นประสิทธิภาพของโปรแกรมก็ยังเหมือนเดิมเพราะใช้ reference counting เช่นเดิม แต่โปรแกรมเมอร์ทำงานสะดวกมากขึ้นเพราะไม่ต้องกังวลเรื่อง retain , release อีกต่อไป ยกตัวอย่างโค้ดง่ายๆ เช่น เมธอด getNewString ซึ่งจะสร้างอ็อบเจ็กสตริงและส่งกลับมา เมื่อเขียนในแบบ ARC จะได้โค้ดดังนี้ Continue reading Objective-C Programming Chapter 16 (Part2)

Objective-C Programming Chapter 16 (Part1)

Chapter 16

LLVM & ARC

 

ที่ผ่านมาได้พูดถึง LLVM (Low Level Virtual Machine) อยู่หลายครั้ง ว่าเป็นส่วนที่สำคัญในการพัฒนาโปรแกรม แต่ยังไม่ได้อธิบายความสำคัญของ LLVM ซึ่งเป็นหัวใจของส่วนขยายความสามารถใหม่ๆในภาษา Objective-C อย่าง Automatic Reference Counting และ Block ถึงแม้ว่าชื่อมันจะบอกว่าเป็น low level virtual machine แต่ LLVM กลับเป็น library และชุดเครื่องมือ (toolschain) ที่ช่วยในการพัฒนาคอมไพลเลอร์ เพื่อที่จะให้เข้าใจที่มาที่ไปของ LLVM มากขึ้นจะขออธิบายการทำงานของคอมไพลเลอร์เบื้องต้นสักนิดหนึ่งก่อน

compiler_arch

 

ในอดีตการออกแบบคอมไพลเลอร์จะประกอบด้วยส่วนสำคัญใหญ่ๆ 3 ส่วนคือ ส่วนที่เกี่ยวข้องกับโครงสร้างของภาษา ที่เรียกว่า front end ในส่วนนี้จะมีกระบวนการปลีกย่อยอีกเช่น Parsing , Scanning , Semantic Analysis หน้าที่หลักๆของส่วนนี้คือทำหน้าที่วิเคราะห์และตรวจสอบว่าโค้ดที่เขียนมานั้นมีความถูกต้องตามข้อบังคับต่างๆของภาษา ซึ่งถ้าหากโค้ดที่เขียนมีความถูกต้องเรียบร้อยแล้ว คอมไพลเลอร์จะสร้าง Intermediet Representation (IR) ซึ่งเป็นชุดคำสั่งระดับล่าง ที่เกือบจะเท่า machine code และส่งต่อไปยัง Optimizer ซึ่งเป็นส่วนที่สอง ในขั้นตอนนี้คอมไพลเลอร์จะปรับปรุงประสิทธิภาพของ IR เช่นการตัดโค้ดที่ไม่จำเป็นออก หรือเปลี่ยนลำดับของคำสั่งเพื่อให้ทำงานได้เร็วขึ้น จากนั้นก็จะส่งต่อไปยังส่วนสุดท้ายคือ back end ซึ่งจะทำหน้าที่แปลง IR ให้กลายเป็น machine code ที่พร้อมจะทำงาน
ข้อจำกัดของการออกแบบคอมไพลเลอร์ลักษณะนี้คือไม่สามารถใช้ได้กับคอมพิวเตอร์ทุกๆสถาปัตยกรรมได้ เช่น คอมพิวเตอร์ในระบบอิเล็กทรอนิกขนาดเล็กอาจจะใช้ ARM ส่วนคอมพิวเตอร์ตั้งโต๊ะมีสถาปัตกรรมแบบ X86 หรือคอมพิวเตอร์สมถรรภาพสูงๆใช้ Itanium เป็นต้น และด้วยสถาปัตกรรมที่แตกต่างกัน ชุดคำสั่งของ CPU ก็ไม่เหมือนกัน หากต้องการจะให้คอมไพลเลอร์ทำงานได้กับสถาปัตยกรรมใด ก็ต้องเขียนคอมไพลเลอร์ขึ้นมาใหม่ ถ้าสมมติหากต้องการจะเขียนคอมไพลเลอร์เพื่อให้รองรับภาษา C , BASIC , Objective-C และสามารถทำงานกับทุกๆสถาปัตยกรรม ARM , X86 นั่นหมายถึงว่าต้องเขียนคอมไพลเลอร์ทั้งหมดเป็นจำนวนถึง 3 x 2 = 6 ตัว เลยทีเดียว หรือถ้ากำหนดให้ n เป็นจำนวนภาษา และ m เป็นจำนวนของสถาปัตยกรรมก็จะเห็นว่าจำนวนคอมไพลเลอร์นั้นมีทั้งสิ้น n x m ซึ่งเป็นจำนวนที่เยอะมากดังที่ได้แสดงในรูปต่อไปนี้

compiler_graph Continue reading Objective-C Programming Chapter 16 (Part1)

Objective-C Programming Chapter 9

ในบทผ่านมาเราได้เรียนรู้กับ Foundation Framework กันไปบ้างแล้วนั่นก็คือ NSString , NSMutableString และ NSScaner ส่วนในบทนี้เราจะเรียนรู้กับคลาส Collection ต่างๆที่มีใน Foundation Framework แล้วคอลเลคชั่นคืออะไร ? คอลเลคชั่นก็คือคลาสหรือโครงสร้างของข้อมูลที่รวบรวมหรือจัดเก็บคลาสอื่นๆ พูดง่ายๆก็คือเป็นคลาสที่สามารถเก็บอ๊อบเจ็คต่างๆไว้ได้ โดยมีการกำหนดรูปแบบในการจัดเก็บ เช่น จัดเก็บแบบระบุตำแหน่งหรือใช้ key ในการอ้างที่จัดเก็บเป็นต้น

Array

การจัดเก็บข้อมูลพื้นที่ง่ายและใช้กันมากที่สุดก็คือ Array อาร์เรย์เป็นคลาสที่เก็บข้อมูลแบบระบุตำแหน่งโดยใช้ตัวเลข (index) เมื่อเราต้องการจะจัดเก็บข้อมูลต้องระบุตำแหน่งว่าจะนำข้อมูลนั้นไปไว้ยังตำแหน่งใดของอาร์เรย์ เมื่อต้องการจะนำข้อมูลออกมาใช้ก็ต้องระบุตำแหน่งที่ต้องการเช่นเดียวกัน เปรียบเสมือนลิ้นชักเก็บเอกสารเมื่อเราต้องการจะจัดเก็บเอกสาร ก็ต้องกำหนดว่าจะเก็บไว้ที่ชั้นใด เมื่อต้องการเอกสารคืนก็ต้องรู้ตำแหน่งของชั้นที่เราเก็บไว้

array

 

ใน Foundation Framework มีคลาสอาร์เรย์ด้วยกัน 2 คลาสคือ immutable และ mutable เช่นเดียวกับคลาสสตริงที่เราได้ลองใช้งานกันไปในบทที่แล้ว สำหรับคลาสแรกที่จะได้ลองเขียนโปรแกรมกันก็คือ NSArray เป็นคลาสแบบ immutable ไม่สามารถเปลี่ยนแปลงแก้ไขใดๆได้ ดังนั้นการกำหนดค่าให้กับอาร์เรย์ต้องทำตั้งแต่การประกาศตัวแปร

Program 9.1

โปรแกรม 9.1 แสดงตัวอย่างการใช้งาน NSArray เริ่มต้นด้วยการประกาศอ๊อบเจ็ค daysName ซึ่งเป็น NSArray การประกาศอาร์เรย์นี้ได้กำหนดค่าเริ่มต้นของอาเรย์ด้วยเมธอด initWithObjects: พร้อมกับค่าสตริงค่าแรกนั่นก็คือ Sunday หลังจากนั้นตามด้วยเครื่องหมาย , (Commar) คั่นตัวแปรเพื่อที่เราจะได้กำหนดค่าในลำดับต่อไปนั่นคือ Monday และไล่ลำดับไปเรื่อยๆจนถึง Satuday ซึ่งเป็นตัวสุดท้าย เนื่องจากเมธอด initWithObjects: สามารถกำหนดค่าเริ่มต้นได้อย่างไม่จำกัด เมธอดนี้จึงได้กำหนดให้ปิดท้ายด้วย nil เพื่อบอกให้รู้ว่าสิ้นสุดการกำหนดค่าเริ่มต้นของอาร์เรย์ Continue reading Objective-C Programming Chapter 9

Foundation Framework IV – Dictionary

ก็ตอนนี้ก็เขียนมาเกือบจะจบ Foundation Framework แล้วอะน่ะ วันนี้มาต่อด้วยเรื่อง dictionary กันดีกว่า

ในภาษา objective-c มี class ที่เป็นลักษณะ data structure ค่อนข้างเยอะมาก และหนึ่งในนั้นที่ควรจะรู้ก็คือ dictionary งั้นมาทำความเข้าใจก่อนเลยละกันว่ามันคืออะไร

NSDictionary นี้มันก็คือ class ที่เก็บตัวแปรหลายๆตัวได้ ไม่จำกัดว่าจะเป็นตัวแปร ชนิดเดียวกันหรือไม่ อาจจะต่างชนิดกันก็ได้ และการเก็บตัวแปรแต่ละตัวนั้นจะมี keyword
เป็นส่วนที่ใช้อ้างอิงถึงตัวแปรนั้น ก็เหมือนๆกับพจนานุกรมนั่นเหละ เวลาเราจะหาความหมายของคำแปรนั้นๆ ก็เปิด dic แล้วก็ค้นหาความหมายโดยใช้ keyword การใช้ NSDicttionary ก็เช่นเดียวกัน อยากได้ตัวแปรไหนก็ใช้ keyword ทำการหาค่าของตัวแปรนั้นๆ

NSDictionary มี class ย่อยๆ 2 ส่วนเหมือนๆกับ NSArray NSString นั่นก็คือ Mutable และ Immutable ซึ่งก็ประกอบไปด้วย class ต่อไปนี้

  • NSDictionary
  • NSMutableDictionary

เรามาดูตัวอย่าง การใช้งานง่ายๆกัน

ตัวโปรแกรมเองก็ไม่ได้มีอะไรซับซ้อนเลย เป็นการเก็บค่าตัวแปรชนิดต่างๆ NSDictionary นั้นจะมี Function สำคัญคือ dictionaryWithObjectsAndKeys
ตรงนี้จะเป็นการประกาศ NSDictionary แล้วเราก็ทำการ init ค่าให้แก่ตัวแปร ถ้าดูจาก code จะเห็นส่วนที่เป็นสี สลับกัน 3 สี โดยที่ตัวแรกคือ data ส่วนตัวที่สองคือ keyword เช่น

  • [NSNumber numberWithInt:] ตัวแรกนี้คือ data ที่่ต้องการเก็บ
  • @”iNumber” ส่วนตัวหลังคือ keyword
จะเห็นว่า NSDictionary นั้นสามารถเก็บตัวแปรที่ต่างชนิดกันได้
เมื่อเราจะเรียกใช้ ก็เพียงแค่ เรียกใช้ function objectForkey: แล้วก็ตามด้วย key ที่ต้องการเช่น [dic objectForKey:@”iString”]
ส่วน NSMutableDictionary นั้นเราก็ทำการประกาศโดยที่ไม่ต้อง init เหมือนกับ NSDictionary ก็ได้ แล้วค่อยมาเพิ่มตัวแปรเข้าไปที่หลังด้วย function ที่ชื่อว่า setObject:forKey เป็นต้นว่า

เวลาเรียกใช้งานก็เหมือนกับ NSDictionary คือเรียก objectForKey ก็เป็นอันจบ ส่วนข้อแตกต่างระกว่าง mutable กับ immutable ผมคงไม่อธิบายแล้วนะครับ เพราะว่าใน NSArray กับ NSString ได้อธิบายไปแล้ว

โหลด source ไปลองเล่นกันได้
Download Foundation Framework IV Source Files