Tag Archives: NSArray

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 III – Array part. 2

มาต่อด้วยเรื่องของ NSArray กันต่อเลยละกัน

ในการประกาศ NSArray จะเห็นว่ามีตัวแปรตัวสุดท้ายเป็น nil ( หรือ NULL ใน C/C++ ) เพื่อเป็นการบอกว่าสิ้นสุด array ดังตัวอย่าง 

NSEnumerator

จากครั้งที่แล้ว การอ้างอิงถึง member ของ array ทำได้ด้วยการ ใช้ method ที่ชื่อว่า objectAtIndex เรายังสามารถเข้าถึง member ได้อีกวิธีหนึ่งนั่นก็การใช้ NSEnumerator

การใช้ NSEnumerator ก็คล้ายกับการใช้ iterator ใน stl ของภาษา c/c++ เลย

Searching

เราสามารถค้นหา object member ใน array ได้ด้วย method ที่มีชื่อว่า containsObject โดย methode นี้จะส่งค่า YES หรือ NO กลับมาให้ และยังมีอีกหนึ่ง method ที่ค้นหาตำแหน่งของ member นั่นคือ  indexOfObject

ตัวอย่าง:

NSMutableArray – 2

ก็เพิ่มเติมในส่วนของ mutable array กันสักหน่อย หลังจากครั้งก่อน เราทำการเพิ่ม member ให้กับ array ด้วย  addObject และ insertObject:atIndex  ไปแล้ว  ยังมีอีก 2 method ที่จำเป็นเหมือนกัน นั่นก็คือ  remove กับ replace

  • remove
    การ ลบ object ทำได้การเรียกใช้ methode ที่มีชื่อว่า removeObject หรือเราอาจจะ ใช้ removeObjectAtIndex เป็นการ ลบ object member ในตำแหน่งที่ต้องการ ออกจาก array
  • replace
    การ replace ทำได้ด้วยการเรียกใช้ replaceObjectsAtIndexes:withObjects:

ตัวอย่างการใช้งาน

ก็วันนี้มี source มาให้ด้วย

Foundation Framework III – Array part. 1

NSArray วันนี้มาว่าด้วยเรื่อง Array  Object  สำหรับ NSArray นั้นคือ class ที่เอาไว้เก็บ object โดยมีลำดับเป็นการอ้างอิง และ array นั่นก็มีอยู่ 2 แบบเหมือนๆกับ string คือ mutable ( เปลี่ยนแปลงค่าได้ ) และ immutable ( เปลี่ยนค่าไม่ได้ )

  • โดยการประกาศ immutable จะใช้ NSArray
  • ส่วน mutable จะใช้ NSMutableArray

การใช้ที่จะไช้ array เราก็ต้องทำการ #import <Foundation/NSArray.h> เข้ามาถึงจะสามารถใช้งานได้

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

Mutable

จากข้างบน เราประกาศตัวแปร dayName แล้วก็ให้กำหนดค่าเริ่มต้น(initial) ให้กับ array  เลย  โดยเราเรียกใช้  arrayWithObjects เพื่อทำการกำหนดค่าให้กับ Array ตั้งแต่ประกาศตัวแปรตั้งแต่แรก  แล้วเราก็มาทำการวน loop ให้แสดงค่าใน array ออกมา  จะมีที่พิเศษใน loop หน่อยก็ตรงที่เราสามารถนับจำนวน array ได้ด้วย count  เช่น  [dayName count];

***  arrayWithObjects   ต้องมี s ด้วยน่ะ  ถ้าไม่งั้นจะเป็น   arrayWithObject แล้วมันจะ  init ได้แค่ตัวเดียว ***

Immutable

ก็การประกาศ NSMutableArray ก็เหมือนๆกับ NSArray จะทำการ init เลยตั้งแต่แรกเหมือน NSArray ก็ได้ แต่จากตัวอย่างเราจะกำหนด ขนาดให้กับ Mutable Array ก่อน แล้วหลังจากนั้นจึงค่อยๆใส่ค่าตัวแปรให้กับ Mutable Array  โดยการเรียกใช้งาน   addObject

และหลังจาก addObject ไปได้ 2 object เราก็  เพิ่ม object ให้กับ Mutable array  โดยการเรียก     insertObject:atIndex  ตรงนี้เป็นการใส่ค่าให้กับ Mutable Array  โดยสามารถกำหนดว่าจะแทรกไว้ตำแหน่งไหนของ Mutable array ก็ได้

ผลลัพธ์ที่ได้ก็จะเป็น แบบนี้

Day name:
Sunday Monday Tueday Wednesday Thursday Friday Saturday

Current array
Summer Winter

After insert
Autumn Summer Winter Spring

*** เดี๋ยวมาต่อเรื่อง Array อีกที  มันค่อนข้างเยอะ ***
ปล. ยังไม่มี source น่ะครับบ