Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf ·...

14
Programming in Objective-C Part I copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

Transcript of Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf ·...

Page 1: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

Programming in Objective-C

Part I

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

Page 2: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

Chapter 1 The Beginning กอนจะลงมือเขียนโปรแกรม จะขอเลาเรื่องราวความเปนมาของภาษา Objective-C สักเล็กนอย เชื่อวาหลายคน

คงจะเขาใจวา Objective-C เปนภาษาใหม แตความจริงแลวภาษา Objective-C ไดพัฒนาตั้งแตป 1986 กอนที่จะมีภาษา

Java และ C# เสียอีก วิศวกรสองคนชื่อ Brad Cox และ Tom Love เปนผูสรางภาษานี้ขึ้นมา ทั้งสองคนไดพัฒนาภาษา

Objective-C โดยตอยอดมาจากภาษา C ซึ่งไดเอาแนวคิด Object-Oriented ของภาษา Smalltalk มาใชและปรับปรุงใหดีขึ้น

อยางไรก็ตามถึงแมวาภาษา Objective-C ไดพัฒนามาหลายปแตก็ยังไมไดเปนที่รูจัก จนกระทั่งเมื่อบริษัท NeXT Computer

ซึ่งเปนบริษัทใหมของ Steve Jobs ที่กอตั้งขึ้นมาหลังจากตัวเองถูกไลออกจากบริษัท Apple ไดสิทธ์ิมาจากวิศวกรสองคนนี้

หลังจากนั้น NeXT Computer ก็ไดรวม Objective-C มาไวเปนสวนหนึ่งของ GCC Compiler พรอมกับพัฒนาชุดคำสั่ง รวมถึง

สรางเครื่องมือตางๆขึ้นมาเพ่ือใชกับคอมพิวเตอรของบริษัท และพัฒนาระบบปฏิบัติการของตัวเองมีชื่อวา NEXTSTEP นี่เปน

เพียงจุดเริ่มตนของเรื่องราวตางๆ

X ระบบปฎิบัติการ NEXTSTEP เปนระบบที่ทันสมัย มีกราฟฟคยูสเซอรอินเตอรเฟสสวยงาม และเปนระบบปฎิบัติการ

แรกที่มีเว็บบราวเซอร แตคอมพิวเตอรของ NeXT นั้นแทบจะขายไมออก เพราะคอมพิวเตอรของ NeXT มีราคาแพงมากและ

NEXTSTEP ก็ใชไดแตเฉพาะกับคอมพิวเตอรของ NeXT เทานั้น เพ่ือหาทางขยายฐานผู ใชในป 1994 NeXT จึงรวมกับบริษัท

Sun Microsystem พัฒนาชุดคำสั่งและเครื่องมือที่เหมือนกับ NEXTSTEP ในชื่อ OPENSTEP เพ่ือใชกับคอมพิวเตอรเครื่อง

อื่นๆที่ไมใชเฉพาะเครื่องของ NeXT เพียงอยางเดียว แมวา OPENSTEP จะใชไดกับเครื่องอื่นๆแตก็ยังไมไดรับความนิยมสัก

เทาไหร ถัดมาอีกสองป Apple ไมสามารถจะพัฒนาระบบปฎิบัติการของตัวเองไดสำเร็จ จึงไดเขาซื้อกิจการของ NeXT

Computer เพ่ือนำ NEXTSTEP/ OPENSTEP มาใชในคอมพิวเตอรของ Apple และเปนผลให Steve Jobs ไดกลับมาทำงานที่

Apple อีกครั้ง ภายหลังจากการเขาซื้อกิจการ ทาง Apple ไดนำเอา OPENSTEP/ NEXTSTEP มาพัฒนาระบบปฏิบัติการตัว

ใหมที่มีชื่อวา Mac OS X ➊ และรวมเอาเครื่องมือในการพัฒนาโปรแกรมอยาง Project Builder และ Interface Builder ➋

เขามา พรอมกับพัฒนาชุดคำสั่งใหมในชื่อ Cocoa ขึ้นมาใชงาน ภาษา Objective-C ก็ไดรวมเขากับ Mac OS X มาตั้งแตตอน

นั้น

X ภาษา Objective-C ไดรวมเขากับ Mac OS X มาตั้งแตแรก แตมันก็ยังไมไดเปนภาษาที่นักพัฒนา Mac

Application จะเลือกใชเปนอันดับแรก เพราะสามารถใชภาษา C/C++ แทนได ➌ ทาง Apple พยายามผลักดันใหนักพัฒนา

มาใช Objective-C แต Application จากคายใหญๆอยาง Adobe ก็ยังเขียนดวย C++ เปนซะสวนมาก จนในป 2008 Apple

ไดออก iPhone พรอมกับปลอยชุดพัฒนา iPhone Application ซึ่งใชภาษา Objective-C ในการพัฒนา ทำใหภาษานี้ไดรับ

ความนิยมแบบกาวกระโดด และตัวภาษาไดปรับปรุงมาเรื่อยจนกระทั่งปจจุบันนี้

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

➊ Mac OS X เปนระบบฎิบัติการของ Apple ที่พัฒนาขึ้นมาตอจาก Mac OS 9 แตไมไดใชโคดเดียวกัน➋ ภายหลัง Project Builder ไดเปลี่ยนเปน Xcode และ Interface Builder ก็ไดรวมกับ Xcode มาตั้งแต version 4➌ นอกจาก Cocoa ยังมี Framework สำหรับภาษา C/C++ ชื่อ Carbon แตรองรับการทำงานแคเพียง 32 bit และในปจจุบันไดหยุดการพัฒนาแลว

Page 3: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

Welcome to Xcodeภาษา Objective-C สามารถใช gcc compiler ผาน terminal เพ่ือคอมไพลโปรแกรมไดโดยตรง แตก็อาจจะไมสะดวกมากนัก

การใชเครื่องมือในการเขียนโปรแกรมเปนทางเลือกดีกวา เครื่องมือในการเขียนโปรแกรมที่จะใชในหนังสือเลมนี้มีชื่อวา Xcode

ซึ่งสามารถโหลดไดจาก Mac App Store สำหรับผูที่ยังไมไดติดตั้ง Xcode ใหโหลดและทำการติดตั้งใหเรียบรอย หลังจากติด

ตั้งเสร็จเรียบรอยแลว เราก็จะไดเครื่องไมเครื่องมืออื่นๆเพ่ิมเติมดวยอยางเชน Instrument และ Dashcode เปนตน

เมื่อเปดโปรแกรม XCode ขึ้นมาจะเห็นหนาตาง Welcome to Xcode เปนตัวชวยอำนวยความสะดวกในการสรางโปรเจค

( รูป 1 หนาตาง Xcode )

เราสามารถสรางโปรเจคใหมไดจากตัวเลือก Create a new Xcode Project นอกจากนี้ยังมีตัวเลือกอื่นอีกเชน Connect to a respository เพ่ือใชเชื่อมตอกับ Source Control เชน svn , git หรือถาตองการเรียนรูการใชงาน Xcode เบื้องตน ก็สามารถเขาดูรายละเอียดไดจาก Learn about using Xcode การสรางโปรเจคขึ้นมาใหมนอกจากจะทำผานที่หนาตางนี้แลว ยังสามารถสรางใหมไดอีกวิธีโดยการเลือกเมนู File > New > New Project

( รูป 2 สรางโปรเจคใหมไดจากเมนู )

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

Page 4: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

เราทดลองสรางโปรเจคใหมกันดีกวาครับจะใชวิธีใดก็ได เมื่อเริ่มสรางโปรเจคใหม ก็จะเห็นหนาตางใหเลือก template ➍ สำหรับโปรเจคที่ตองการจะสราง โดยจะแบงออกเปน 2 สวนหลักๆคือ iOS และ Mac OS X และในแตสวนก็จะแบงยอยลงไปอีก เชน Application , Framework & Library ดังรูป 3

(รูป 3 หนาตางเลือก template)

โปรเจคแรกที่เราจะลงมือสรางกันก็คือ Command Line Tool และจะใช command line tool นี้เปน template หลักในหนังสือเลมนี้ เมื่อเราเลือก template ของโปรเจคเสร็จแลว ตอไปก็ใหกรอกรายละเอียดตางๆที่ปรากฎ ซึ่งเปนรายละเอียดปลีกยอยของโปรเจคที่จะสราง เริ่มดวยชอง Product Name ใหใสชื่อของโปรเจคที่ตองการ เชนโปรเจคนี้เราจะใชชื่อวา HelloWorld

(รูป 4 รายละเอียดของโปรเจคที่จะสรางใหม )

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

➍ Template คือรูปแบบโครงสรางอยางคราวๆ ที่มีการกำหนดคาบางอยางมาใหแลว ซึ่งชวยอำนวนความสะดวกใหเราไมตองไปจัดการตั้งคาตางๆเหลานั้น

Page 5: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

ตรงชอง Company Identifier ในตอนนี้ยังไมตองสนใจใหคงไวดังเดิม รายละเอียดที่สำคัญของการสรางโปรเจคคือตองเลือก Type ใหเปนแบบ Foundation เพราะเราตองการจะสรางโปรเจคโดยใชภาษา Objective-C สวน Type แบบอื่นๆเชน Core Service , Core Foundation นั้นเปนภาษา C X โปรเจคที่เปนภาษา Objective-C มีอยูสองอยางก็คือ Core Data และ Foundation แต Core Data อยูนอกเหนือหนังสือเลมนี้ และยังมีจุดที่สำคัญอีกอยางก็คือการใช Automatic Reference Counting ➎ ใหเลือกออก เรายังไมไดใชในตอนนี้ ( การใช Automatic Reference Counting จะไดทำในบทหลังๆ ) เมื่อกรอกรายละเอียดตางๆเรียบรอยแลวใหกดที่ Next

(รูป 5)

จากนั้นจะมีหนาตางขึ้นมาถามเราวาตองการจะสรางโปรเจคไวที่ไหน ก็ใหเราเลือกไปยังโฟลเดอรที่เราตองการ สวนตัวเลือก Create local git repository for this project ใหเลือกออก เนื่องจากหนังสือเลมนี้ไมไดครอบคลุมการใชงาน Git➏ เทานี้ก็เปนอันเสร็จสิ้นกระบวนการสรางโปรเจคใหม เมื่อสรางโปรเจคสำเร็จ Xcode จะแสดง workspace windows ซึ่งจะไดอธิบายสวนประกอบตางๆกันตอไป

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

➎ Automatic Reference Counting ( ARC ) เปนฟเจอรของ LLVM 3.0 อำนวยความสะดวกในการจัดการหนวยความจำ➏ แนะนำใหผูอานศึกษาการใช Source Control เพ่ิมเติมไมวาจะเปน SVN หรือ Git เพราะเปนเครื่องมือที่ชวยใหเราสามารถยอนกลับไปดูโคดเกาๆที่เราเคยแกไขไปโดยการเปรียบเทียบกันกับโคดปจจุบัน และยังชวยในการทำงานเปนทีมอีกดวย

Page 6: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

Workspace Windowsหลังจากที่เราไดสรางโปรเจคขึ้นมาหรือเปดโปรเจคจะพบกับ Worspace ซึ่งเปนหนาตางหลักในการทำงาน โดยแบงออกเปน

สวนตางๆที่สำคัญ ไดแก Navigation , Toolbar , Editor , Debug และ Utility

➎Navigation Area

Toolbar Area

Editor Area

Debug Area

Utility Area

(รูป 6 Workspace windows)

1. Navigation Area รายละเอียดที่แสดงในสวนนี้จะเปลี่ยนไปตาม Navigator (รูปที่ 7 ) ที่ไดเลือกไว ประกอบไปดวย

(รูป 7 Navigator )

● Project Navigator บอกขอมูลเก่ียวกับไฟลตางๆที่ใชในโปรเจคของเรา เชน source code , header และ

Framework ที่ใชในโปรเจคเปนตน

● Symbol Navigator ในสวนนี้จะบอกขอมูลเก่ียวกับ class และ symbol ตางๆในโปรเจค

● Search Navigator ใชในการคนหาคำตางๆ และแสดงคำที่เคยคนหากอนหนานี้

● Issue Navigator แสดงความผิดพลาดตางๆ เชน error หรือ warning จากการคอมไพลโปรแกรม

● Debug Navigator แสดง thread และตัวแปรตางๆในการ debug ปกติเมื่อเรา debug จะเปลี่ยนมาใช navigator นี้

โดยอัตโนมัติ

● Breakpoint Navigator บอกตำแหนงของ breakpoint ที่ไดวางในโปรเจค

● Log Navigator แสดงรายงานของการคอมไพล

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

Page 7: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

(รูป 8 Toolbar)

2. Toolbar Area ในพ้ืนที่สวนนี้จะประกอบไปดวย สวนที่ใชงานบอยๆอยางเชน Run Stop และการจัดการหนาตางของ

Xcode เชนการ ปด/เปด Debug Area รวมไปถึงการรายงานผลของการคอมไพล

3. Editor Area เปนพ้ืนที่สำหรับไวเขียนโปรแกรม ในสวนนี้อาจจะเปลี่ยนเปนแสดงผลอยางอื่น ก็ไดเชนในกรณีที่เราเลือก

Log Navigator พ้ืนที่สวนนี้ก็จะรายงานผลของการคอมไพล ดังรูป

(รูป 9 Log Navigator)

4. Degug Area เมื่อเราทำการ debug ในพ้ืนที่สวนนี้จะไวใชสำหรับแสดงผลของ console และตัวแปรและคาตางๆของ

โปรแกรม (การใช debug area นี้จะอธิบายการใชงานเพ่ิมเติมในบทตอไป)

5. Utility Area จะเปลี่ยนไปตามสวนตางๆของ Navigator หรือสวนที่เรากำลังใชงาน ( การใช template แบบ Command

Line Tool นี้แทบจะไมไดใชสวนนี้เลย )

Project File Structorหลังจากการสรางโปรเจคเสร็จแลว Project Navigator จะแสดงไฟลที่ใชในโปรเจคทั้งหมด

(รูป 10 Project Navigator)

Project Navigator จะแบงไฟลออกเปน 2 สีดวยกันคือ สีแดงและสีดำ ถาไฟลมีสีแดง แสดงวา Xcode หาไฟลนี้ไมเจอ อาจจะ

มีการยาย โดนลบ หรือยังไมมีไฟลนี้อยู จากรูป 10 จะเห็นวาในโฟลเดอร Products มีไฟล HelloWorld เปนสีแดง แสดงวายัง

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

Page 8: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

ไมมีไฟลนี้อยูนั่นก็เพราะวายังไมไดทำการคอมไพลนั่นเอง หากทำการคอมไพลจะไดไพล HelloWorld ซึ่งเปนไฟลโปรแกรมที่

ไดจากโปรเจคนี้และหลังจากนั้นไฟลก็จะเปลี่ยนเปนสีดำโดยอัตโนมัติ

ไฟลที่แสดงใน Project Navigator ที่จำเปนตองรูจัก มีอยูดวยกัน 4 ชนิดคือ

1. Header File ( .h ) เปนไฟลไวสำหรับการประกาศคลาสและเมธอดชื่อของไฟลมักจะเปนชื่อเดียวกับคลาส เชนถาประกาศ

คลาสชื่อ Student ก็จะมี header file ชื่อ Student.h

2. Source File ( .m ) เปนไฟลที่ไวเขียนการทำงานของคลาสมักจะมีชื่อเหมือนคลาสเชน Student.m

3. Framework & Library คือไลบรารีที่นำมาใชใน application เชน Foundation.framework ถาเราใช dynamic library อาจ

จะไฟลชนิดอื่นเชน libx.dylb หรือถาเปน static library ก็จะเปน libx.a เปนตน

4. Product คือผลลัพธที่ไดจากโปรเจคนี้ โดยมักจะเปน application หรือโปรแกรม แตถาสราง Project โดยใช template อื่น

เชน Static Library ก็จะได Product เปนไลบรารีแทน

เมื่อสรางโปรเจคใหม Xcode จะสรางโฟลเดอรบางอยางอยูแลวเชน Frameworks , Products , Supporting Files เปนตน แต

การแสดงที่อยูของไฟลในโฟเดอรตางๆที่เราเห็นจาก Project Navigator ไมไดไมไดเก่ียวของกับที่อยูจริงของไฟลในเครื่อง

คอมพิวเตอรแตอยางใด เราสามารถสรางโฟลเดอรขึ้นมาไดเอง และจะยายไฟลใดมาไวก็ได

Your First Program ?ทุกครั้งที่สรางโปรเจคขึ้นมาใหม Xcode มักจะมีโคดตัวอยางใหเรามาอยูแลว และในโปรเจคที่เราสรางขึ้นมานี้ก็มีโปรแกรมสุด

คลาสสิก มาใหดวยนั่นก็คือโปรแกรมที่แสดงคำวา HelloWorld

Program 1.1

//// main.m// HelloWorld//// Created by Ter on 1/24/12.// Copyright (c) 2012 __MyCompanyName__. All rights reserved.//

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]){ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog (@"Hello, World!"); [pool release]; return 0;}

ยังไมตองไปทำความเขาอะไรกับโปรแกรม เราจะทำการคอมไพลและใหโปรแกรมทำงานกอน โดยใหกดปุม Run ที่อยูบริเวณ

toolbar และดูผลลัพธของโปรแกรมทาง debug area จะเห็นผลดังนี้

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

Page 9: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

(รูป 11 Console Output)

ยินดีดวยครับคุณไดสรางโปรแกรม HelloWorld เสร็จแลว ในขณะที่ยังไมไดลงมือเขียนโคดใดๆเลย ชางงายดายเสียจริงๆ !

Explanation of Your First ProgramX กอนที่จะอธิบายโปรแกรม มาทำความรูจักไวยากรณ (systax) ของภาษากันสักนิด ไมวาจะเปนภาษาที่เราใชพูดๆกัน

เชนภาษาไทย ภาษาอังกฤษ หรือภาษาใดๆบนโลก ลวนแตมีไวยากรณทั้งสิ้น เพราะไวยากรณเปนตัวกำหนดรูปแบบของ

ภาษา อาจจะกลาวไดวาเปนขอบังคับของภาษาก็วาได ฉะนั้นแลวในภาษาคอมพิวเตอรเองก็มีไวยากรณเหมือนกัน อยางที่ได

ทราบไปวาภาษา Objective-C นั้นพัฒนามาจากภาษา C ดังนั้นแลว syntax ก็คลายๆกับภาษา C ซึ่งมีขอบังคับที่สำคัญคือ

ทุกคำสั่ง (statement) ตองจบดวยเครื่องหมาย ; เสมอ ตัวอักษรพิมพเล็กและพิมพใหญถือเปนคนละตัวกัน X

X เมื่อรู syntax คราวๆไปแลวก็มาดูโคดกันตอเลย จากโปรแกรมที่เขียนไปเจ็ดบรรทัดแรกนั้นเรียกโคดสวนนี้วาคอมเมนต (comment) ซึ่งคอมเมนตนี้จะไมถูกคอมไพล พูดงายๆคือไมไดมีสวนเก่ียวของกับการทำงานของโปรแกรมเลย การเขียนคอมเมนตทำไดอยูสองแบบ วิธีแรกคือใชสัญลักษณ // นำหนาบรรทัดที่ตองการ เชน

// Sample comment

สวนวิธีที่สองนั้นจะใชสัญลักษณสองตัวติดกันคือ / และ * เพ่ือเปนการบอกวา ตั้งแตตำแหนงนี้เปนตนไปถือเปนคอมเมนต และจะใชสัญลักษณเดิม เพียงแตสลับตำแหนงกันนั่นก็คือ * และ / เพ่ือเปนการบอกจุดสิ้นสุดของคอมเมนต เรามักจะใชวิธีการลักษณะแบบที่สองนี้กับการเขียนคอมเมนตหลายๆบรรทัด เชน

/* Multiple lines comments more and more .... Copyright (c) 2012 Ter. All rights reserved.*/

ถึงแมคอมเมนตจะไมไดมีสวนเก่ียวของกับการคอมไพล แตการเขียนคอมเมนตนั้นควรจะหัดใหเปนนิสัยในการเขียนโปรแกรม เพราะเราสามารถที่จะใชคอมเมนตอธิบายสวนตางๆของโปรแกรม หรืออาจจะเขียนสิ่งที่ตองทำในขั้นตอนตอไป ทำใหเราหรือคนที่มาอานโปรแกรมของเราเขาใจไดงายขึ้น และการเขียนคอมเมนตยังชวยใหเราจำสิ่งที่เราไดเขียนไปเมื่อยอนกลับมาดูในภายหลัง

การเขียนคอมเมนตเปนเรื่องที่ดี แตถาเขียนคอมเมนตไมตรงกับการทำงานของโปรแกรม อาจจะกลายเปนหายนะได ดังนั้นเมื่อเรา

ทำการปรับปรุงโคดของโปรแกรมก็ควรจะแกไขคอมเมนตดวย

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

Page 10: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

จากบรรทัดคอมเมนตถัดมาคือ

#import <Foundation/Foundation.h>

โดยปกติแลวในการเขียนโปรแกรมจะมีไฟลที่เราเขียนขึ้นเองและที่ไมไดเขียนขึ้นเองเชนไฟลของระบบหรือ Library ตางๆ

การเรียกใช #import ➐ ก็เปนการบอกคอมไพลเลอรวาใหเอาไฟลที่ตองการใชงาน เขามาคอมไพลรวมกับโปรแกรมที่เราเขียน

ดวย จากตัวอยางโปรแกรม 1.1 ไดรวมเอาไฟล Foundation.h เขามาใชเพราะเปนไฟลพ้ืนฐานของระบบและใชในการสราง

วัตถุพ้ืนฐานในโปรแกรม

int main (int argc, const char * argv[])

โปรแกรมทุกโปรแกรมของภาษา Objective-C บังคับใหมี function อยางนอยหนึ่งฟงกชั่นนั่นคือฟงกชั่น main เพราะวาหลัง

จากทีร่ะบบปฏิบัติการไดโหลดโปรแกรมเขาสูหนวยความจำโปรแกรมจะเริ่มทำงานที่ฟงกชั่น main เปนอันดับแรก โปรแกรม

อาจจะมีหลายฟงกชั่นแตท้ังโปรแกรมเราจะมี main ไดเพียงแคฟงกชั่นเดียวเทาน้ัน สวนทายบรรทัดในเครื่องหมาย

วงเล็บ int argc , const char* argv[] เรียกวา command-line argument ในตอนนี้ยังไมตองทำความเขาใจใหขามไปกอน

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

บรรทัดนี้เปนการจองหนวยความจำใหกับ autorelease pool ซึ่ง autorelease pool นี้กวา 99% ในการเขียนโปรแกรมดวย

Objective-C ตองมีเสมอ เนื่องจากเปนสวนชวยในการบริหารจัดการหนวยความจำสำหรับวัตถุตางๆในโปรแกรม (จะอธิบาย

เพ่ิมเติ่มเก่ียวกับ autorelease pool ในบทของ memory managment อีกครั้ง)

NSLog (@"Hello, World!");

เรียกใชฟงชั่น NSLog ใชสำหรับการแสดงผลทาง Console โดยสงพารามิเตอร @”Hello World” ➑ เขาไป เมื่อการทำงานของ

บรรทัดนี้จบลง ที่หนาจอ Console ก็จะแสดงคำวา Hello World นั่นเอง

[pool drain];

หลังจากที่โปรแกรมไดจองหนวยความจำใหกับ autorelease pool เมื่อเลิกใชงานก็ตองคืนหนวยความจำที่ถูกใชใหกับระบบ

ปฎิบัติการ และบรรทัดสุดทาย

return 0;

เปนการสงคาที่ไดหลังจากการทำงานของโปรแกรมใหกับระบบปฎิบัติการ ถาโปรแกรมปดโดยไมไดเกิดขอผิดพลาดคาที่สง

กลับมักจะเปนคา 0 แตถาโปรแกรมปดตัวเพราะความผิดพลาด เชนอานขอมูลจากไฟลไมได ก็อาจจะสงคาอื่นๆกลับมาแทน

และถาสังเกตุดูที่ Console จะเห็นบรรทัดสุดทายเขียนวา Program ended with exit code: 0 เพ่ือบอกใหเราทราบวา

โปรแกรมไดจบลงดวยสถานะ 0 ซึ่งเปนคาที่ไดจากสงกลับเมื่อจบโปรแกรมนั่นเอง หลังจากไดลองคอมไพลโปรแกรมแรกโดยที่

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

➐ เรียกคำสั่งที่มี # วา preprocessor directive เชน #import , #define➑ ถาเคยเขียน C มากอนอาจจะงงวามี @ นำหนาขอความกับไมมีตางกันอยางไร ? ถาเขียน @ นำหนาจะหมายถึง string object ของภาษา Objective-C แตถาไมเขียนจะหมายถึง constant string ของภาษา C

Page 11: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

ยังไมไดลงมือเขียนอะไรเลยไดสำเร็จแลวก็อาจจะรูสึกไมคอยภูมิใจเทาไหร ตอไปเราจะลงมือเขียนโปรแกรมดวยฝมือเราเอง

ใหแกไขโปรแกรม 1.1 โดยเพ่ิม NSLog เขาไปในโปรแกรมของเรา เปนดังตัวอยางโปรแกรมที่ 1.2

Program 1.2

#import <Foundation/Foundation.h>

int main (int argc, const char *argv[]){ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog (@"Hello, World!"); NSLog (@"Hello, Objective-C programming!"); [pool drain]; return 0;}

คงจะเดาไดใชไหมวาผลลัพธที่ไดจากโปรแกรมจะเปนอยางไร ? แนนอนโปรแกรมจะแสดงผลลัพธดังนี้

Program 1.2 Output

Hello, World!Hello, Objective-C programming!

อยาลืมวาเมื่อจบคำสั่งตองใสเครื่องหมาย ; ไมเชนนั้นจะเกิด error ได

ตัวอยางโปรแกรม 1.2 จะเห็นวาเราไดเรียก NSLog สองครั้งเพ่ือแสดงผลสองบรรทัด แตตัวอยางตอไปเราสามารถที่จะเขียน

โปรแกรมใหทำงานลักษณะเดิมแตใหเรียกใช NSLog ครั้งเดียวได

Program 1.3

#import <Foundation/Foundation.h>int main (int argc, const char *argv[]){ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog (@"Hello...\n..1\n...2\n....3"); [pool drain]; return 0;}

ลองพิจารณาดูอีกครั้งวาโปรแกรมจะแสดงผลอยางไร ?

Program 1.3 Output

Hello.....1...2....3

จะเห็นวาเราเขียนโปรแกรมแคบรรทัดเดียว แตแสดงผลลัพธถึงสี่บรรทัดดวยกัน นั่นเปนเพราะวา NSLog นั้นสามารถใช

สัญลักษณพิเศษเพ่ือกำหนดรูปแบบของการแสดงผล ใหเปนตามที่ตองการได สัญลักษณที่วานี้จากตัวอยางคือ เครื่องหมาย \

และตามดวยตัวอักษร n สัญลักษณตัวนี้หมายความวาใหขึ้นบรรทัดใหม เมื่อเรากลับไปดูที่โปรแกรมอีกครั้ง จะเห็นวามี

สัญลักษณ \n ถึงสี่ครั้งดวยกัน โปรแแกรมจึงแสดงผลถึง 4 บรรทัด และสัญลักษณพิเศษอื่นๆที่ไดใชบอยๆก็เชน

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

Page 12: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

สัญลักษณ การแสดงผล

\n ขึ้นบรรทัดใหม (newline)

\t tab

\\ แสดงสัญลักษณ \

\” แสดงสัญลักษณ “

จากโปรแกรมที่ไดลองเขียนไปสองสามโปรแกรม นาจะทำความเขาใจไดไมยาก ลองฝกการสรางโปรเจคและใชงาน NSLog

ใหคลอง เพราะจำเปนตองใชในบทตอๆไป

Behind the scene กอนจะขามไปยังบทตอไป ขออธิบายเพ่ิมเติมเก่ียวกับการคอมไพลโปรแกรมกันสักนิดวา เบื้องหลังสิ่งที่ Xcode นั้นทำใหเรา

คืออะไร มีสิ่งใดเกิดขึ้นบาง

Compile

Compile

Link

Link

Link

Source Files

Source Files

Object Files

Object Files

Library

Execute File

(รูป 12 Console Output)

เมื่อสั่งให Build หรือกดปุม Run สิ่งที่จะเกิดอยางแรกก็คือไฟล Header (.h) , Prefix Header (.pch) จะเขากระบวนการที่เรียก

วา precompile เพ่ือเปนการเตรียมความพรอมกอนเขาสูการคอมไพล และหลังจากนั้น Source (.m) จะถูกคอมไพลดวยคอม

ไพลเลอรเชน GCC หรือ LLVM และหลังจากกระบวนการคอมไพลจบลงจะได Object Files (.o) ของแตละ Source ถาโปร

เจคของเรามี Source Code หลายไฟลก็จะได .o มากตามไปดวย เมื่อการคอมไพลจบลงคอมไพลเลอรจะหมดหนาที่ และสง

มอบหนาที่ตอไปใหกับ Linker เพ่ือนำ Object Files ทั้งหมดมารวมกัน ถาหากมี Library ก็จะถูกนำมารวมดวยกันและไดเปน

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

Page 13: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

ผลลัพธสุดทายซึ่งก็คือ Execute File นั่นเอง เห็นไดวากวาจะไดออกมาเปน Program สักตัวมีกระบวนการหลายขั้นตอนและ

ซับซอนแตโชคดีที่เรามีเครื่องมืออยาง Xcode กระบวนการทั้งหลายเหลานี้จึงไมตองทำดวยตัวเอง

Summaryในบทแรกนี้เราไดสรางโปรเจคใหม และไดใชงาน Xcode กันไปพอสมควร นอกจากนี้เรายังไดเขียนโปรแกรมอีกสองสาม

โปรแกรมนับเปนกาวแรกของการเริ่มตนเขียนโปรแกรมดวยภาษา Objective-C ในบทตอไปเราจะไดเรียนรูพ้ืนฐานตางๆของ

ภาษา Objective-C เชนการประกาศตัวแปร หรือคาคงที่

ทายบทมีแบบทดสอบใหไดลองทำนาจะชวยใหผูอานไดทบทวน คิดและทำความเขาใจ เพ่ิมมากขึ้น ลองทำกันดูครับวาทำได

บางหรือเปลา

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com

Page 14: Programming in Objective-C - macfeteriamacfeteria.com/.../2012/08/Objective_C_Chapter_1.pdf · มาใช Objective-C แต Application จากค ายใหญ ๆอย าง

Easy Exercises 1

1. ขอใดตอไปนี้อาจจะทำใหเกิด error ได

ก) NSLog (@"Programming is fun!")!

ข) NSLog (@"Programming is fun!");;

ค) NSLog (@"Programming is "super easy" and fun!");

ง) //NSLog (@"Programming is fun!")!

2. เขียนโปรแกรมแสดงขอความตอไปนี้Hello "Objective-c Programming"It is very fun!!!! and more fun?

3.โปรแกรมตอไปนี้แสดงผล แบบใด#import <Foundation/Foundation.h>int main (int argc, const char *argv[]){ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog (@"Objec\tive-c is \not hard '\\="); [pool drain]; return 0;}

ก) Objec! ive-c is ot hard '\=

ข) Objecive-c is not hard '\=

ค) Objecive-c is ot hard '\=

ง) ไมมีขอถูก

4.จงหา error ของโปรแกรมตอไปนี้ และแกไขใหถูกตอง

#import <Foundation/Foundation.h>int main (int argc, const char * argv[]){ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // EXAMPLE OF /* COMMENT */

NSLog("Objective-C is very easy"); NSLog(@"and Fun") [pool drain]; return 0;}

copyright 2012 Jakrit Tamnakpho - http://www.macfeteria.com