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 น่ะครับบ

Foundation Framework II – String

หลังจากที่ได้ลองใช้งาน Framework ไปบ้างแล้ว วันนี้ก็มาดูตัวอย่างการใช้งาน String กันบ้าง
โดยปกติแล้วเราจะมี Class เพื่อใช้ในการจัดการเกี่ยวกับ string อยู่ด้วยกัน 2 class นั่นก็คือ

  • NSString
  • NSMutableString

สอง class นี้มี method ที่คล้ายกัน เพราะว่า NSMutableString นั้นเป็น Child-Class ของ NSString

NSString

NSString นั้นเป็น class ที่เอาไว้จัดการ string ทั้งหลายไม่ว่าจะเป็นการ copy , compare , substring แต่มีข้อจำกัดคือ มันไม่สามารถที่จะแก้ไขได้หลังจากการ initial ไปแล้ว

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

จาก ข้างบน จะเห็นว่าประกาศตัวแปรเป็น NSString* ทั้งหมด 5 ตัวแปร แต่การประกาศนั้นต่างกันออกไป โดยที่


  • ก็ทำการประกาศตัวแปรขึ้นมาแบบเป็น pointer ไว้เฉยๆ

  • ประกาศตัวแปรขึ้นมาโดยกำหนดให้เป็นคำว่า Hello และ Macfeteria สังเกตุว่าจะมีเครื่องหมาย @ นำหน้าก็เพื่อบอกว่า “Macfeteria” เป็น Constance String Object

  • การประกาศแบบนี้น่าจะคุ้นน่ะเพราะว่า เราได้ทำการ alloc และแบบนี้เราก็สามารถ นำเอา char* มาแปลงให้เป็น NSString ได้ ยกตัวอย่างเช่น

  • ประกาศและจองพื้นที่ไว้แต่ยังไม่ได้เอาไปใช้งาน

หลังจากประกาศตัวแปรก็มีการเรียกการใช้งาน Function ของ NSString ก็มีตั้งแต่การ copy , compare , concatenate , substring ที่จะขออธิบายก็ที่เห็นบ่อยๆจากตัวอย่างคือ
cString สำหรับ cString จะเป็นการ return string ในรูปแบบของ char* กลับมา แบบนี้เราก็สามารถนำไปใช้ได้กับ printf หรือ function ของภาษา C ได้
และก็จะมี การเปรียบเทียบ เราอาจจะเปรียบเทียบโดยใช้ == แบบปกติ (แต่ต้องอย่าลืม @ นำหน้าด้วย) หรืออาจจะใช้ function isEqualToString ก็ได้

เมื่อทำการ compile และ run program เราจะได้เห็นผลลัพธ์แบบนี้

string

ในระหว่าง ที่ compile หลายคนอาจจะเห็นว่า มันจะขึ้น warning ในลักษณะแบบนี้

warning

ก็ไม่ต้องไปตกใจอะไรนะครับ จริงๆมันก็ทำงานได้แต่ที่มันขึ้น warning “cString” is deprecated แบบนี้มาก็เนื่องจากว่า cString ที่เราได้เรียกใช้นั้น SDK 10.5 ไม่ได้ใช้แล้วและในอนาคตก็คงจะเอาออก ก็แปลได้ง่ายๆว่า cString มันจะใช้ไม่ได้ในอนาคต ถ้าหากว่าเรามีแผนการต้องเปลี่ยน ไปใช้ SDK ที่ใหม่กว่าในอนาคต ก็ควรจะเลิกใช้ cString เปลี่ยนไปใช้  อย่างอื่นแทน ในกรณีนี้ เค้าแนะนำว่า ให้ไปใช้ cStringUsingEncoding: แทน ฉนั้นแล้ว เราก็อาจจะเขียน ใหม่ได้ว่า

ในส่วนของ NSUTF8StringEncoding นี้ก็เป็น parameter ที่บอกว่าให้ encode string ออกมาเป็นแบบไหน คือเนื่องจากว่า char ปกติแล้วมันเก็บข้อมูลในลักษณะ 1 byte ฉนั้นแล้วก็จะมีตัวอักษรทั้งหมดแค่ 256 เท่านั้น ต่อมาเมื่อภาษาต่างๆเริ่มมีความสำคัญ เค้าก็เลยเปลี่ยนไปเก็บ string ในรูปแบบที่ไม่ใช่ char แต่เป็น ลักษณะแบบอื่นแทน อาทิเช่น multiple byte , wide char และด้วยเหตุนี้เอง เราจำเป็นต้องระบุว่า จะให้มัน encode string ออกมาเป็นอะไร

NSMutableString

เป็น class ที่เอาไว้จัดการ string เหมือนกัน แต่ต่างกันตรงที่ มันสามารถแก้ไขได้ ภายหลัง ดูตัวอย่างการใช้งาน NSMutableString

เมื่อทำการ compile และ run ก็จะได้ผลลัพธ์ดังตัวอย่าง

mutablestring

ดูจากตัวอย่าง code แล้วคิดว่าไม่น่าจะยากนะครับ

NSMutableString VS NSString

ข้อที่แตกต่างระหว่าง NSMutableString และ NSString นั้นนอกจากเรื่องที่แก้ไข string ได้และไม่ได้ ยังคงมีข้อควรระวังอยู่ ยกตัวอย่างเช่น

ดูจากตัวอย่าง code ข้างบนแล้วแทบจะไม่น่าจะผิดอะไรเลย compile ก็ผ่านปกติ แต่ว่าเวลาที่ run จริงๆ มันจะไม่ผ่านครับ จะเห็นเกิด error แบบนี้

error

ด้วยเหตผลก็เพราะว่า จริงอยู่ว่าเราประกาศ NSMutableString ขึ้นมาใช้ แต่ตอนที่เรา init มันเรากลับ init ให้มันเป็น NSString ( string ที่ประกาศด้วยเครื่องหมาย @ จะถือว่าเป็น NSString หรือพูดง่ายคือเป็น Constance ไม่สามารถแก้ไขได้ )

และอีกตัวอย่าง ลองดู  code ต่อไปนี้

จะเห็นว่า code ทั้งสองอย่างไม่ว่าจะเป็น NSMutableString และ NSString นั้นก็สามารถ append string ได้เหมือนกัน
แล้วมันต่างกันยังไง ?
จาก code นะครับ  NSString

  • ns ชี้ pointer ไปยัง memory เพื่อทำการจอง string “Hello”
  • หลังจากนั้นจะเห็นว่า ns ต้องการ append string “Macfeteria”
  • แต่สิ่งที่ ns ทำจริงๆคือ การย้าย pointer ชี้ไปยังตำแหน่งของ memory ใหม่ที่ได้จากการสร้าง string โดย append

ส่วน NSMutableString

  • muString ชี้ pointer ไปยัง memory เพื่อทำการจอง string “Hello”
  • muString ทำการ append string “Macfeteria” ยังตำแหน่ง memory เดิม

ฉนั้นแล้ว การ Append ในกรณี NSString  นั้นจะเกิด Memory Leak  ครับ เพราะ s ได้ย้าย pointer ไปชี้ยัง memory ส่วนใหม่ (Hello Macfeteria) ส่วนตำแหน่งเดิม (Hello) ก็ไม่ได้ release  จึงเกิด Memory Leak ขึ้น

ถ้าหากต้องการ แก้ไข code ที่ถูกต้องควรจะเป็น

ก็เพิ่ม autorelease เข้าไปเพื่อให้มัน release memory หลังจากไม่ได้ใช้แล้วโดยอัตโนมัติ

ก็ลองศึกษาเพิ่มเติมการใช้งานได้จาก web ของ apple ได้เองที่ http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html

ส่วน source code ก็นี่เลย Download Foundation Framework II (NSString) Soure Files

Talk: New Macbook Pro

เพิ่งได้ macbook pro 15″ ตัวใหม่มาเลย เป็นรุ่นต่ำสุดของ macbook pro ละ มันมาพร้อมกับ multi-touch แต่ว่าผมไม่ค่อยได้ใช้เท่าไหร่ เพราะส่วนมากเอามาทำงานเขียนโปรแกรมซะมากกว่า แต่ลองๆดูก็คงได้ความหรูที่เพิ่มขึ้น ( มันมีแค่นั้นจริงๆน่ะ )  ก็อย่างที่่บอกว่าไม่ค่อยได้ใช้งานเท่าไหร่  ก็กลายเป็นว่า ตอนนี้ผมมี Mac ปาเข้าไป 3 เครื่องละ แต่เครื่องหลักๆคือ Mac Pro ก็เลยถ่ายรูปมาให้ดู

ปล. ออฟฟิศซื้อให้น่ะครับ ไม่ได้ออกเงิน ถ้าออกเองนี่ คงอดข้าวหลายเดือน

แล้วตอนนี้สภาพที่ทำงานก็เป็นแบบนี้ mac pro พร้อมกับ 2 monitor และ อีก 1 macbook pro

Foundation Framework I – Number

หลังจากเขียน basic – objective-c ได้สักพัก คิดว่าอาจจะไม่มันส์เท่าไหร่ วันนี้ลองมาเขียนเกี่ยวกับ Foundation Framework มั่งจะดีกว่า เพราะยังไงก็ต้องได้ใช้ class เหล่านี้ในการ พัฒนาโปรแกรม สำหรับ mac และแน่นอนว่า สำหรับ iPhone ด้วย

สำหรับ อย่างแรกที่จะพาลองเขียนกัน ก็คือการใช้งาน class ที่ชื่อว่า NSNumber สำหรับ class นี้จะเกี่ยวข้องกับเลขทั้งหมด เพราะว่า int ,float , longs พวกนี้เป็น basic data type มันไม่ใช่ Object และในเมื่อมันไม่ใช่ Object ก็แน่นอนว่า เราไม่สามารถส่ง message (เรียก function) ไปหามันได้ และอีกอย่างก็คือว่าจะมี class บางจำพวกที่ต้องการเก็บ เป็น Object ไม่ใช่ basic data type อย่างเช่นว่า NSArray เป็นต้นโอเคงั้นก็ดู code ตัวอย่างก่อนเลยแล้วกันว่ามันทำอะไรได้บ้าง

ก็มาเริ่มที่ header กันก่อนเลย เราทำการ import ในส่วนของ Foundation Framework เข้ามาหลายตัว ส่วนที่สำคัญในตัวอย่างข้างบนก็คือ

ตรงส่วนนี้เป็นการจองหน่อยความจำให้กับ autoreleasepool เหตุผลก็เพราะว่าในถ้าโปรแกรมเราเรียกใช้ foundation class ทั้งหลายเราจำเป็นต้องมี autoreleaspool เนื่องจากว่ามันช่วยอำนวยความสะดวกในการจัดการ memory ของระบบ คือหลังจากที่เรามี autoreleasepool แล้วทุก object จะถูกส่งเข้ามายัง pool ที่เราสร้างขึ้นเพื่อที่ว่าตอนปิดโปรแกรม มันจะได้มาดูว่าใน pool มีอะไรอยู่และจะทำการ release object ใน pool เพื่อคืนหน่วยความจำ และตอนก่อนปิดโปรแกรมก็อย่าลืมเรียก release

เอาละ  เราได้ประกาศตัวแปร มาหลายตัวเป็นต้นว่า doubleNumber แล้วก็ทำการใส่ค่าให้มันโดยการเรียก numberWithDouble แล้วก็ลองแสดงค่าผลลัพธ์ของแต่ละตัวแปรออกมา ก็เป็นอันจบ จะมีที่แปลกๆหน่อยก็คงจะเป็น isEqualToNumber สำหรับ method นี้ก็เป็นการเปรียบเทียบว่าเลขสองตัวนี้มันเท่ากันหรือไม่

คิดว่า code ไม่น่ายากน่ะ ถ้าเอาไป compile  แล้ว run ดูก็จะได้ผลลัพธ์ แบบนี้

200
500.250000
12345000000000000000.000000
Numbers are not Equal

หลายคนอาจจะบอกว่าทำไมไม่ประกาศเป็น int , float ซะก็น่าจะใช้ได้เหมือนกัน จริงๆก็ใช้ได้ครับ แต่ว่าขอเน้นย้ำว่า NSNumber มันเป็น class น่ะ ไม่ใช่ basic data type จุดประสงค์ของผมก็คือ ต้องการประกาศ object แล้วเดี๋ยวเราจะได้ใช้ประโยชน์ร่วมกับ Foundation class  ตัวอื่นๆอีก

สำหรับตัวอย่าง Source Code ก็โหลดได้ที่นี่ครับ
Download Foundation Framework I (NSNumber) Source Files

Talk: iPhone SDK – II

ตอนแรกผมว่าจะเขียน iphone sdk ละ แต่คิดว่ามันยังไม่ถึงเวลาจะเขียน เพราะอีกตั้งหลายเดือนกว่าจะที่มันจะ update firmware และเราก็คงทำได้แค่ เขียนและลองใช้แต่เฉพาะ กับ emulator แต่ก็เท่าที่อ่านข่าวมาหลายอย่างก็พบว่า มันยังมีกฎต่างๆของ iphone ที่ห้ามไว้ เป็นต้นว่า ห้ามเขียนโปรแกรมที่เกี่ยวกับซิมการ์ด เป็นต้นและอื่นๆอีกมากมาย เท่าๆที่ผมอ่านๆมาเหมือนว่า Java ก็ไม่สามารถทำงานได้เพราะว่ามันเป็น interpreter ซึ่งก็เป็นข้อห้ามของ apple

และผมก็ได้อ่าน review จาก http://www.blognone.com/node/7210 ของคุณ MK ได้เขียนไว้แต่ผมไม่ค่อยเห็นด้วยน่ะ คือเท่าที่อ่านมา เค้าเข้าใจว่ามันเขียนได้เฉพาะ objc แต่จริงๆแล้วมันเขียนได้ด้วย c/c++ อีกภาษา และผมก็ไม่เห็นด้วยตรงที่เค้าบอกว่า

” ข้อดีคือเทคโนโลยีที่ใช้ใน iPhone เป็นเทคโนโลยีที่พิสูจน์แล้วว่าสมบูรณ์ มั่นคง แข็งแรง บั๊กน้อย (ภาษาอังกฤษเรียก mature) แถมประหยัดสตางค์ของแอปเปิลเอง เพราะจ้างนักพัฒนาเขียนไลบรารีครั้งเดียว ใช้ได้ทั้งบนคอมพิวเตอร์ และ iPhone (รวมถึง iPod touch ดังจะกล่าวต่อไป) นักพัฒนาที่คุ้นเคยกับแมคอยู่แล้วก็สบาย แทบไม่ต้องเรียนรู้อะไรใหม่ยกเว้น Cocoa Touch กับเทคโนโลยีเฉพาะของ iPhone อย่างอื่นอีกเล็กน้อยเท่านั้น

แต่ข้อเสียก็มาพร้อมกัน คือนักพัฒนาบนแมคที่ว่าเนี่ย มันมีอยู่สักกี่คนกันเชียว การเรียนรู้ชุดเครื่องมือเหล่านี้ต้องลงทุนสูงพอสมควร อย่างน้อยๆ ต้องซื้อเครื่องแมคมาใช้ ตามอัพเดตใช้ซอฟต์แวร์เวอร์ชันล่าสุดอยู่เสมอ (iPhone SDK รันได้เฉพาะบน Leopard 10.5.2 ขึ้นไป และฮาร์ดแวร์อินเทลเท่านั้น) แถมพัฒนาซอฟต์แวร์บนแพลตฟอร์มนี้แล้วก็รันได้แต่บนแมค ตลาดมีขนาดเล็กมากเมื่อเทียบกับพีซี ยิ่งในประเทศไทย จะหาคนที่พัฒนาซอฟต์แวร์บนแมคเพื่อเลี้ยงชีพนี่แทบนับนิ้วได้ “

จริงๆแล้วข้อดี คือเพราะมันแทบจะเหมือน Api ของ OSX นั่นไม่ใช่ว่ามันจะทำให้ apple ประหยัดเงินสำหรับจ้างนักพัฒนาของตัวเอง แต่มันหมายถึงการพอร์ทโปรแกรมจาก mac มายัง iphone นั้นจะง่ายมากและนักพัฒนาก็เรียนรู้ cocoa touch เพิ่มเติม

ข้อเสียผมก็ไม่ค่อยเห็นด้วยเท่าไหร่ ก็จริงอยู่ว่านักพัฒนาบน mac มันน้อย และตลาดมันแคบ เค้าอาจจะมองว่ามันต้องเขียนด้วย Objc อย่างเดียวมันจึงไม่น่าสนใจ จริงๆข้อเสียทีผมคิดว่ามันน่าจะเป็นที่ การหา resource สำหรับการพัฒนา หรือการเรียนรู้ Carbon/Cocoa นั้นน้อยมากๆ ( นี่เป็นสาเหตุหลักๆ ของผมที่เขียน blog นี้ขึ้นมา ) ผมก็คิดเหมือนกับเค้าน่ะว่า จะหานักพัฒนาซอฟแวร์บนแมคเพื่อเลี้ยงชีพ ในเมืองไทยจะมีสักกี่คน ผมก็ไม่รู้น่ะว่าเมืองไทยจะมีกี่คน แต่ให้เดา ไม่น่าจะถึง 20 คน ไม่ได้หมายถึงว่า เขียน web , php , perl , ruby บน mac น่ะ แต่หมายถึงคนที่ต้องเขียน Objc/Cocoa/Carbon แบบนี้

ความเป็นจริงผมก็ไม่คิดว่า จะได้มาเขียน  software บน mac แบบจริงๆจังๆน่ะ แต่ด้วยว่าอยากลองของใหม่ เลยต้องทำให้ผมต้องพัฒนาโปรแกรมบน mac เพื่อเลี้ยงชีพ จริงๆการเรียนรู้การเขียนโปรแกรมบน mac ไม่ได้ยากเลย แต่ที่สำคัญมากๆก็คือ แหล่งข้อมูลมันน้อยมากๆ ลำพังอ่าน doc ของ apple เองก็อาจจะงง ได้ง่ายๆ ผิดกับ Microsoft ที่เค้ามี MSDN เป็นแหล่งรวมทุกๆอย่างสำหรับการพัฒนา ถ้าจะให้เทียบ แล้วเหมือนกับ ร้านหนังสือ B2S คือ Apple ส่วน Amazon คือ Microsoft อะไรแบบนี้เลย  แหล่งข้อมูลมันต่างกันเยอะมากๆ ก็ไม่แปลกที่ทำไมว่า คนเขียนโปรแกรมบน mac มันน้อยนัก