Objective-C Programming Chapter 15 (Part2)

Blocks and Cocoa

ในตัวอย่างที่ผ่านๆมา เราได้ใช้ block กันไปบ้าง แต่ยังไม่ได้ใช้เฟรมเวิร์คและ API ต่างของ cocoa และ cocoa touch ซึ่งมีเมธอดที่เกี่ยวข้องกับใช้บล็อกอยู่มากมาย เมธอดเหล่านี้แบ่งออกเป็นกลุ่มใหญ่ๆทั้งหมด 6 กลุ่มด้วยกันคือ Completion handlers , Notification handlers , Error handlers , Enumeration , View animation and transition และ Sorting เพื่อให้เข้าใจมากขึ้นจะเขียนโปรแกรมเพื่อใช้งานบางส่วนจากทั้งหมด ซึ่งโปรแกรมที่จะเขียนต่อไปนี้ เป็นโปรแกรมที่เคยเขียนมาแล้วในบทก่อน นั่นคือจัดเรียงสมาชิกในอาร์เรย์ แต่คราวนี้จะใช้บล็อกในการจัดเรียงสมาชิก

Program 15.7
main.m

Continue reading Objective-C Programming Chapter 15 (Part2)

Objective-C Programming Chapter 15 (Part1)

Chapter 15

Blocks

บล็อกเป็นส่วนขยายของภาษา C,C++ และ Objective-C ที่ทาง Apple ได้เพิ่มเติมเข้ามา ส่วนขยายนี้เป็นแบบ non standard extension นั่นหมายความว่าไม่ใช่คอมไพลเลอร์ทุกตัวที่จะรองรับ แต่มีเพียงบางตัวเท่านั้นที่สามารถใช้งานได้ เช่น GNU Compiler และ CLang LLVM ถึงแม้ว่าบล็อกจะมีลักษณะคล้ายกับฟังก์ชั่น คือ ทำงานได้เหมือนกับฟังก์ชั่น สามารถรับพารามิเตอร์ได้ แต่ก็มีส่วนที่แตกต่างกันกับฟังก์ชั่นพอสมควร เช่น ไม่จำเป็นต้องตั้งชื่อ หรือ ไม่ต้องระบุชนิดของ return type เป็นต้น ในภาษา Objective-C บล็อกถือเป็นอ็อบเจ็กชนิดหนึ่ง ดังนั้นเราจึงสามารถส่งแมสเซจ หรืออาจจะเก็บบล็อกไว้ใน collection class เช่น NSArray หรือ NSDictionary ได้ บล็อกเป็นส่วนสำคัญในการพัฒนา Cocoa Application และ iOS Application เพราะได้ถูกออกแบบมาเพื่อรองรับเทคโนโลยี Grand Central Dispatch ทำให้การพัฒนาโปรแกรมแบบ Concurrent Programming ทำได้ง่ายขึ้น และยังเหมาะกับการใช้เป็น callback เพราะบล็อกสามารถนำโค้ดการทำงานของ callback และข้อมูลที่จำเป็นไปพร้อมกับบล็อกได้

Function pointer

บล็อกมีความคล้ายคลึงกับ function pointer เป็นอย่างมาก จึงควรที่จะทำความเข้าใจ function pointer เบื้องต้นกันเสียก่อน แล้ว function pointer คืออะไร ? ฟังก์ชั่นพ้อยเตอร์ก็คือพ้อยเตอร์ที่ชี้ไปยังฟังก์ชั่น อาจจะเกิดความสงสัยว่าทำได้ด้วยเหรอ ? ไม่ว่าจะเป็นข้อมูล อ็อบเจ็ก หรืออะไรก็ตาม เมื่ออยู่ในหน่วยความจำก็ย่อมมีตำแหน่งของหน่วยจำเสมอ ฟังก์ชันก็เช่นเดียวกัน การใช้ function pointer มีประโยชน์มากในบางกรณี เป็นต้นว่า เมื่อเขียนโปรแกรมให้รองรับทั้ง iPhone และ iPad โค้ดของโปรแกรมส่วนมากใช้ร่วมกันได้ แต่ก็มีบางส่วนที่ไม่สามารถใช้งานร่วมกันได้ เราอาจจะแก้ปัญหานี้ด้วยการใช้ macro อย่าง #ifdef และเขียนฟังก์ชั่นสำหรับ iPad แยกออกมาจาก iPhone  ดังเช่นโค้ดต่อไปนี้

ถ้าโปรแกรมเรียกใช้ฟังก์ชั่นเพียงไม่กี่ครั้ง ก็คงไม่มีปัญหาอะไร แต่ถ้าหากโปรแกรมเรียกใช้ฟังก์ชั่นหลายๆครั้ง โค้ดของโปรแกรมก็จะยาวขึ้นและเข้าใจยากมากขึ้นไปด้วย

อีกหนึ่งวิธีของการแก้ปัญหาคือการใช้ฟังก์ชั่นพ้อยเตอร์ ซึ่งการประกาศฟังก์ชั่นพ้อยเตอร์มีรูปแบบดังนี้

fpter

Continue reading Objective-C Programming Chapter 15 (Part1)