[iOS Dev] nil / Nil / NULL / NSNull : What's different ?

มาทำความเข้าใจเกี่ยวกับความว่างเปล่าในคอมพิวเตอร์ อะไรคือความว่างเปล่าในคอมพิวเตอร์
ในเมื่อรากฐานของคอมพิวเตอร์คือ Binary ที่มีค่า 0 และ 1 เท่านั้น แล้วอะไรล่ะ ที่จะแสดงถึงความว่างว่างเปล่าของอะไรบางอย่างในคอมพิวเตอร์


ในภาษา Objective-C นั้น มีหลายสิ่งที่กล่าวถึงความว่างเปล่า โดยหนึ่งเหตุผลที่ต้องมีหลายอย่างเนื่องมาจาก Objective-C เป็น Superset ของภาษา C (หมายความว่าสามารถที่จะ Compile C ได้ด้วย) 

ในภาษา C นั้นแสดงค่าว่างปล่าวด้วย 0 สำหรับข้อมูลพื้นฐานหรือ NULL ในเชิง Pointer (แต่ Context ของ Pointer นั้นถือว่าเป็นค่าเท่ากัน) การที่ Objective-C ถูกสร้างบนภาษา C และเป็น Object Oriented Language จึงได้เพิ่ม nil เพื่อนแทนค่าความว่างเปล่าของวัตถุ nil สามารถเป็นตัวชี้บอกความว่างเปล่า หรือไม่มีค่าบน Objective-C ถึงแม้ว่าจะดูไม่เหมือนกัน แต่ในทางเทคนิคแล้วเหมือนกัน 

ในระดับของ Framework, Foundation (Framework พื้นฐานของภาษา Objective-C) ได้มี Class ที่ชื่อว่า NSNull และประกาศ Class method: +null ที่ให้วัตถุ Singleton ของ NSNull กลับมา ซึ่ง NSNull จะต่างกับ NULL และ nil ซึ่ง NSNull จะดูเป็นวัตถุมากกว่าที่จะเป็นค่า 0 (ในเชิงข้อมูลพื้นฐาน)

ใน Foundation/NSObjCRuntime.h มีการประกาศ Nil เป็น Class Pointer ของความว่างเปล่า ซึ่งจะคล้ายๆ กับ nil แต่ก็ไม่ได้ใช้บ่อยนัก

There's something about nil

NSObject ทุกชนิดเมื่อทำการสร้างและจองพื้นที่ (Allocation) ในระบบแล้วเนื้อหา (Content) ของ Object ที่สร้างขึ้นจะชี้ไปที่ 0 โดยอัตโนมัติ นั่นหมายความว่า Object ที่ถูกสร้างขึ้น (ในขณะที่ยังไม่ได้กำหนดค่าเริ่มต้น) จะชี้ไปยังค่า nil เสมอ

การส่ง message ไปยัง Object ที่ว่างเปล่า (nil) ในภาษาอื่นๆ เช่น C++ นี่จะทำให้โปรแกรมของคุณ Crash เลยทีเดียว แต่ในภาษา Objective-C การส่ง message ไปหา Object ที่ว่างเปล่าจะสามารถทำได้ โดยจะให้ค่าเป็น 0 และไม่ Crash ดังนั้นเวลาที่จะส่ง message หา Object ใดๆ จึงไม่จำเป็นที่จะต้องเช็คว่า Object นั้นเป็น nil หรือปล่าว ? จากตัวอย่างต่อไปนี้


จากตัวอย่าง ถ้า name ไม่มีค่า จะหมายความว่าเรากำลังส่ง message ไปหา nil object ซึ่งจะทำให้ค่าเป็น 0 และไม่ผ่านเงื่อนไขแค่นั้น ไม่ทำให้โปรแกรม Crash แต่อย่างใด

NSNull: Something for Nothing

NSNull ถูกใช้ทุกที่ใน Foundation Framework ที่ไม่สามารถชี้ไปค่า nil ตรงๆ ได้ เช่น NSArray, NSDictionary ที่ไม่สามารถมีค่า nil ได้ ซึ่งอาจจะคิดว่า NSNull คือ nil ที่มีสภาพเป็นวัตถุและอ้างอิงได้ใน Collections ต่างๆ ก็ได้



ทบทวนกันอีกครั้ง นี่คือ 4 สัญลักษณ์ของความว่างเปล่าที่ Objective-C Programmer ทุกคนควรรู้


Reference: NSHipster

Popular posts from this blog

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

[Android Dev] การติดตั้ง Eclipse+AndroidSDK เพื่อพัฒนาโปรแกรมบน Android

"อีสุกอีใส" ประสบการณ์เมื่อต้องมาเป็นตอนอายุ 22