หลังจากศาสดาองค์ใหม่ Tim Cook ขึ้นเปิดตัว iPhone 4S กันไปเมื่อคืนที่ผ่านมา 4 ตุลาคม 2554 พร้อมทั้งปล่อย Xcode 4.2 GM Seed มาให้เหล่านักพัฒนาส่งแอปของตัวเองขึ้น App Store กันได้แล้วจากเวอร์ชั่นนี้ (Beta จะไม่สามารถส่งแอพขึ้น App Store ได้)
 
มีอะไรใหม่ใน Xcode 4.2?
  • Automatic Reference Counting - ไม่ต้อง retain reelase autorelease
  • Storyboard - ออกแบบอินเตอร์เฟสและความสัมพันธ์ระหว่าง View ได้ในไฟล์เดียว
  • เปลี่ยนค่าเริ่มต้นคอมไพเลอร์เป็น Apple LLVM 3.0 จาก GCC 4.2 
  • เพ่ิมเติม มีอะไรใหม่ใน iOS 5 ( for Developer )

เปลี่ยนมาใช้ Automatic Reference Counting (ARC)

ด้วยข้อดีหลายประการของ ARC ทั้งการควบคุมหน่วยความจำที่ทำโดยอัตโนมัติ โค้ดดูสะอาดตาขึ้น เพราะไม่ต้องมีส่วน retain, releaes, autorelease, autorelease pool, dealloc อยู่ในโค้ดเลย ทำให้ดูคุ้มค่าที่เราจะเสียเวลามาปรับโค้ดเพื่อให้รองรับฟีเจอร์นี้ โดยทำตามนี้

  1. เปิดโปรเจคเราขึ้นมาใน Xcode 4.2 (แนะนำให้ทำการแบ็คอัพก่อน)
  2. คลิกชื่อโปรเจคเรา -> เลือกแทป Build Settings
  3. ค้นหาคำว่า automatic ในช่องค้นหา
  4. เปลี่ยนคอมไพเลอร์เป็น Apple LLVM 3.0
     
  5. กำหนดค่า Objective-C++ Automatic Reference Counting... เป็น Yes
     
หลังจากนั้นกดคอมไพล์ จะขึ้น error ในหลายจุดโดยเฉพาะ retain, release, retainCount และ autorelease pool ที่เราสร้างไว้ ให้ลบโค้ดส่วนนั้นออกทั้งหมด
 
 
ลบ method dealloc ออก
 
method init จะต้อง return ค่าเป็นคลาสเดียวกัน หรือ id เท่านั้น ในเคสนี้แก้เป็น (id) initURLRequest:....
 
เปลี่ยนจากการประกาศ (retain) (assign) ในไฟล์ .h เป็น (strong) (weak)
 
หรือถ้าใครไม่อยากทำทั้งหมดนี้ด้วยตัวเอง สามารถสั่งให้ Xocde แปลงโดยอัตโนมัติได้จาก
Edit -> Refactor -> Convert to Objective-C ARC
 
 
* ข้อควรระวัง หากใช้การแปลงอัตโนมัติ จะขึ้น conflit ให้เราแก้เป็นจำนวนมากขึ้นกับขนาดของโปรเจค เราควรแก้อย่างระมัดระวัง เพราะจะมีผลกระทบกับ logic ของโค้ดด้วย
 
ส่วนฟีเจออื่นๆ อย่าง storyboard หากใครสนใจสามารถดูโค้ดตัวอย่างได้จาก example project ใน Xocde 4.2 ได้เลยครับ (ติ๊กถูกตรง storyboard ทุกครั้งที่สร้างโปรเจคใหม่)
 
หากใครมีข้อสงสัย หรือติดปัญหาการแปลงโค้ดเป้น Xocde 4.2 แชร์กันมาได้ในโพส หรือ email มาถามกันได้ครับ
 

Comment

Comment:

Tweet

ผมมีปัญหากับ facebook api ครับ ไม่ทราบว่ามีวิธีแก้ไขมั้ยครับ

#1 By T-Dej (223.205.238.63) on 2011-11-16 12:34