แนวทางปฏิบัติที่ดีที่สุดสำหรับ iOS 5 (ปล่อย / คงไว้?)


109

ในฐานะที่เป็นโปรแกรมเมอร์ iPhone เริ่มต้นแนวทางปฏิบัติที่ดีที่สุดในการเขียนแอพเพื่อใช้กับ iOS 5 หรือเวอร์ชันเก่ากว่าคืออะไร โดยเฉพาะอย่างยิ่งฉันควรใช้การเผยแพร่ / การเก็บรักษาข้อมูลต่อไปหรือฉันควรเพิกเฉยต่อสิ่งนั้น มันสำคัญหรือไม่?


1
ใช้ ARC และปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดตามที่ระบุไว้ที่นี่: amattn.com/2011/12/07/arc_best_practices.htmlหากคุณทำเช่นนั้นคุณจะพบว่า ARC "ใช้ได้ผล" หากคุณไม่ปฏิบัติตามแนวทางปฏิบัติเหล่านั้นคุณจะพบกับการรั่วไหลและใช้เวลามากมายในการติดตามพวกเขา ....
13

คำตอบ:


98

มันขึ้นอยู่กับคุณ. คุณสามารถเขียนแอปโดยใช้ ARC (Automatic Reference Counting) และ Xcode จะเขียน "glue code" เพื่อให้แอปที่เปิดใช้งาน ARC ของคุณทำงานบน iOS 4 ได้โดยไม่จำเป็นต้องแก้ไข อย่างไรก็ตามบางสิ่งไม่สามารถใช้งานได้และไลบรารีจำนวนมากที่คุณอาจต้องการใช้ (บางครั้ง) จะทำให้เกิดข้อผิดพลาดมากมายและคุณจะไม่สามารถใช้งานได้จนกว่านักพัฒนาจะปล่อยการอัปเดตที่เข้ากันได้กับ ARC


แก้ไข : ฉันเพิ่งค้นพบว่าคุณสามารถปิด ARC ทีละไฟล์ได้ ดูpixelfreakคำตอบ 's ดังนั้นคำแนะนำของฉันยังคงมีอยู่ แต่ตอนนี้ห้องสมุดบุคคลที่สามไม่จำเป็นต้องได้รับการอัปเดตเพื่อทำงานกับ ARC

นี่คือสิ่งที่ Apple กล่าวเกี่ยวกับการเลือกไม่ใช้ ARC สำหรับไฟล์บางไฟล์:

เมื่อคุณโอนย้ายโปรเจ็กต์เพื่อใช้ ARC แฟล็กคอมไพเลอร์ -fobjc-arc จะถูกตั้งค่าเป็นค่าดีฟอลต์สำหรับไฟล์ต้นทาง Objective-C ทั้งหมด คุณสามารถปิดใช้งาน ARC สำหรับคลาสเฉพาะโดยใช้แฟล็กคอมไพเลอร์ -fno-objc-arc สำหรับคลาสนั้น ใน Xcode ในแท็บ Build Phases เป้าหมายให้เปิดกลุ่ม Compile Sources เพื่อแสดงรายการไฟล์ต้นฉบับ ดับเบิลคลิกไฟล์ที่คุณต้องการตั้งค่าแฟล็กป้อน -fno-objc-arc ในแผงป๊อปอัปจากนั้นคลิกเสร็จสิ้น

ใส่คำอธิบายภาพที่นี่

ดูคู่มือการเปลี่ยนแปลงเต็มรูปแบบที่นี่


15
เห็นได้ชัดว่า ARC สามารถปิดได้บนพื้นฐาน "ต่อไฟล์" บางทีอาจอนุญาตให้ใช้ไลบรารีเดิมได้ ... แต่ฉันไม่ได้เล่นด้วยก็เลยไม่รู้ ฉันค่อนข้างตื่นเต้นกับมัน คุณนึกภาพออกไหมว่าโลกที่นักพัฒนา iOS ไม่ต้องเสียเหงื่อในการเก็บ / ปล่อย? เราจะคุยอะไรกันที่ SO ?? ;-)
Dan Ray

45
เมื่อในที่สุดฉันก็สามารถจัดการกับอึการจัดการหน่วยความจำทั้งหมดได้ดีและจากนั้นพวกเขาก็ทำให้มันไม่เกี่ยวข้อง งาน !!!
Kongress

@ แดน: คุณไม่ได้ล้อเล่นมันสามารถเลือกปิด? กรุณาให้ลิงค์ที่สำคัญสำหรับฉัน! : D
sudo rm -rf

1
ฉันเชื่อว่าตอนนี้คอมไพเลอร์ไม่ได้อยู่ภายใต้ NDA ดังนั้นหากต้องการแยกไฟล์บางไฟล์ (โดยทั่วไปคือโฟลเดอร์ซอร์สของบุคคลที่สาม) ออกจากโค้ดของคุณเพียงแค่เพิ่มสิ่งนี้เป็นตัวเลือกคอมไพเลอร์ให้กับแต่ละไฟล์: -fno-objc-arc
blackjack75

2
@Yar: ใช่ค่ะ ฉันหวังว่ามันจะเรียบง่าย แต่น่าเสียดายที่ไม่ใช่ทุกห้องสมุดที่เรียบง่าย ลองJSONKitยกตัวอย่างเช่น ลองเรียกใช้ผ่านการตรวจสอบ ARC คุณจะเห็นว่าฉันหมายถึงอะไร ;)
sudo rm -rf

170

สำหรับใครที่ยังสงสัยเกี่ยวกับวิธีปิด ARC ในแต่ละไฟล์นี่คือสิ่งที่ฉันทำ:

  1. ไปที่การตั้งค่าโครงการของคุณภายใต้ Build Phases > Compile Sources
  2. เลือกไฟล์ที่คุณต้องการให้ ARC ปิดใช้งานและเพิ่มแฟล็กคอมไพเลอร์-fno-objc-arc คุณสามารถตั้งค่าแฟล็กสำหรับไฟล์หลายไฟล์ในช็อตเดียวโดยเลือกไฟล์จากนั้นกดปุ่ม "Enter"

ฉันไม่รู้ว่านี่เป็นวิธีที่แนะนำหรือเปล่า แต่ใช้ได้กับฉัน

PS: ฉันรวบรวมข้อมูลนี้จาก clang.llvm.org ที่นี่ซึ่งสามารถเข้าถึงได้โดยสาธารณะดังนั้นจึงไม่อยู่ภายใต้ NDA


1
เมื่อฉันใช้แฟล็กนี้กับไลบรารีมันใช้งานได้ แต่ทันทีที่ฉันรวมไฟล์ lib .h ลงในคลาส ARC Xcode ก็บ่นราวกับว่าฉันไม่มีแฟล็กที่นั่น คุณสามารถทำให้ไลบรารีรุ่นเก่าทำงานกับแฟล็กนี้ได้หรือไม่
casey

ฉันสามารถทำให้ ASIHttpRequest และ SBJson ทำงานได้ (ฉันได้รับคำเตือน 1 ครั้งเกี่ยวกับการใช้งานโครงสร้างใน Reachability.h) ฉันใส่แฟล็กในไฟล์การนำไปใช้งานทั้งหมด
pixelfreak

ไฟล์การนำไปใช้งานทั้งหมดหรือเพียงแค่. h? ในส่วน Compile Sources ของโครงการมีเฉพาะไฟล์ส่วนหัวไม่มีไฟล์การนำไปใช้งาน ฉันสามารถเพิ่มได้ แต่ไม่สามารถทำได้ดูเหมือนจะได้ผลที่แตกต่างออกไป สำหรับการอ้างอิงของคุณฉันกำลังพยายามให้โปรแกรมแยกวิเคราะห์ REST ทำงาน ( github.com/mirek/NSMutableDictionary-REST.framework )
casey

1
อ๊าาา! ฉันไม่ได้ตรวจสอบข้อผิดพลาดอย่างละเอียดเพียงพอ เป็นข้อผิดพลาดที่แตกต่างจากการไม่มีแฟล็ก ฉันต้องลบกลุ่มการปล่อยอัตโนมัติออกจากรหัสและ wha-la!
เคซี่

เมื่อฉันเลือกหลายไฟล์และกด Enter ตามที่แนะนำไว้ที่นี่ไฟล์ทั้งหมดจะถูกลบออกจาก 'แหล่งที่มาของการรวบรวม' ในขั้นตอนการสร้าง ฉันต้องเลือกทีละรายการ ไม่แน่ใจว่าฉันทำอะไรผิด
Gopalakrishnan Subramanian

10

iOS 5 ยังคงอยู่ภายใต้ NDA และอาจถึงเวลาปล่อยเวอร์ชันสาธารณะ หากคุณมีบัญชีนักพัฒนาให้ไปที่ฟอรัมนักพัฒนาของ Appleแล้วถามที่นั่น

สำหรับเวอร์ชันก่อนหน้าคุณต้องนับการอ้างอิงและเก็บรักษาและเผยแพร่ตามนั้น ตรวจสอบคู่มือจัดการหน่วยความจำ

แก้ไข:นี่คือข้อมูลจำเพาะสาธารณะสำหรับการนับอ้างอิงอัตโนมัติและคำพูดจากหน้าiOS 5 สาธารณะ :

Automatic Reference Counting (ARC) สำหรับ Objective-C ทำให้การจัดการหน่วยความจำเป็นงานของคอมไพเลอร์ ด้วยการเปิดใช้งาน ARC ด้วยคอมไพเลอร์ Apple LLVM ใหม่คุณจะไม่ต้องพิมพ์คำว่าเก็บหรือรีลีสอีกครั้งทำให้ขั้นตอนการพัฒนาง่ายขึ้นอย่างมากในขณะที่ลดข้อขัดข้องและการรั่วไหลของหน่วยความจำ คอมไพเลอร์มีความเข้าใจอย่างถ่องแท้เกี่ยวกับออบเจ็กต์ของคุณและเผยแพร่แต่ละออบเจ็กต์ทันทีที่ไม่ได้ใช้งานอีกต่อไปดังนั้นแอพต่างๆจึงทำงานได้เร็วที่สุดเท่าที่เคยมีมาพร้อมประสิทธิภาพที่ราบรื่นและคาดเดาได้


แอปพลิเคชันที่พัฒนาโดยใช้ iOS 5 จะทำงานร่วมกับ iPhone รุ่นเก่าได้หรือไม่
Geekgirl

คุณจะสามารถใช้เครื่องมือในการพัฒนาสำหรับระบบปฏิบัติการรุ่นเก่าได้ แต่จะไม่สามารถใช้เทคโนโลยีใหม่ ๆ เช่น ARC ได้ หากคุณต้องการกำหนดเป้าหมายระบบปฏิบัติการรุ่นเก่าคุณจะต้องจัดการหน่วยความจำด้วยตนเอง หากคุณต้องการใช้ ARC คุณจะต้อง จำกัด ผู้ใช้ไว้ที่ iOS 5
nevan king

1
การอ้างอิงถึง ARC อยู่ในผู้พัฒนาเพจ Apple ที่เปิดเผยต่อสาธารณะapple.com/technologies/ios5 ดังนั้นอย่างน้อยก็มีบางส่วนที่ไม่อยู่ภายใต้ NDA
cobbal

8
ที่จริงไม่จริงเลย คุณสามารถสร้างสำหรับ iOS 4 ด้วย ARC คำกล่าวจากวิศวกรของ Apple: " สำหรับ iOS 4 และ Mac OS 10.6 คอมไพเลอร์จะเพิ่มโค้ดกาวความเข้ากันได้กับรันไทม์ให้กับแอปของคุณซึ่งใช้ได้กับทุกอย่างยกเว้นตัวแปร __weak ซึ่งต้องการการสนับสนุนมากกว่าที่โค้ดความเข้ากันได้จะให้ ARC บน iOS 4 นั้นง่ายกว่าโค้ดที่ไม่ใช่ ARC แต่ก็ไม่ง่ายเหมือน ARC บน iOS 5 "อย่างไรก็ตามแอปกำหนดการ WWDC เขียนด้วย ARC และทำงานบน iOS 4 ได้ดี!
sudo rm -rf

3
อ๋อ; อย่างไรก็ตามที่ผ่านการรับรองใน ARC talk เนื่องจากมีเพียง 4.3.x เป้าหมายเท่านั้นที่ได้รับ 'กาวที่เข้ากันได้'
Alan Zeino

4

ในขณะนี้รายละเอียดอาจไม่ชัดเจน / อยู่ภายใต้ NDA แต่ Apple ได้ใช้ Automatic Reference Counting (ARC) ใน iOS 5 ตามรายละเอียดที่นี่: http://developer.apple.com/technologies/ios5/

หากคุณพัฒนาแอปใหม่ใน Xcode 4 ด้วย iOS 5 SDK คุณสามารถละเว้นการนับการคง / การเผยแพร่ได้อย่างปลอดภัย

[แก้ไข] sudo rm -rf เป็นจุดที่ดี Libs ของบุคคลที่สามอาจได้รับผลกระทบอย่างมีนัยสำคัญ


แอปพลิเคชันที่พัฒนาโดยใช้ iOS 5 จะทำงานร่วมกับ iPhone รุ่นเก่าได้หรือไม่
Geekgirl

มันจะทำงานบน iPhone ที่ใช้ iOS 5 ดังนั้นเฉพาะ iPhone 3GS หรือ iPhone 4 ฉันไม่เชื่อว่ามันจะรองรับ iOS 4 แต่อีกครั้งมันทำโดย LLVM เมื่อคอมไพล์ดังนั้นจึงอาจเป็นไปได้ที่จะสร้างไบนารีสำหรับ iOS 4 และ 5 ขอแนะนำเป็นอย่างยิ่งให้มีบัญชีนักพัฒนา iOS และลองใช้ตัวเลือกต่างๆ
Dominic

ดังที่ sudo ชี้ให้เห็นในความคิดเห็นของเขาเกี่ยวกับคำตอบของ nevan คุณสามารถกำหนดเป้าหมายกลับไปที่ iOS 4.0 ด้วย ARC ได้ดังนั้นอุปกรณ์รุ่นเก่าที่สามารถเรียกใช้ระบบปฏิบัติการนั้นจึงเข้ากันได้กับสิ่งนี้
Brad Larson

3

ไม่มีใครกล่าวถึงSystemConfiguration.framework ? โปรดอย่าลืมที่จะใส่ลงในกรอบ ฉันใช้เวลาหลายชั่วโมงอย่างน่าสังเวชในการตระหนักถึงมัน


คุณควรอธิบายว่าทำไม
John Riselvato

3

เป็นทางเลือกของผู้พัฒนาหรือทีมงานอย่างแน่นอน ARC (ตัวนับอ้างอิงอัตโนมัติ) ทำให้สิ่งต่างๆง่ายขึ้นเล็กน้อยด้วยการจัดการหน่วยความจำให้คุณโดยอัตโนมัติ มันจะปล่อยกักเก็บและ dealloc ตามความเหมาะสม ฉันเชื่อว่าคุณควรได้รับประสบการณ์การจัดการหน่วยความจำด้วยตัวเองโดยเฉพาะอย่างยิ่งในแอปพลิเคชันทดสอบหากคุณยังไม่ได้ทำ สิ่งที่ควรพิจารณาอีกประการหนึ่งคือแอปพลิเคชันของคุณอาศัยไลบรารีของบุคคลที่สามหรือไม่ซึ่งหากไม่แปลงเป็น ARC จะทำให้แอปพลิเคชันของคุณไม่สามารถรวบรวมได้ ทางเลือกขึ้นอยู่กับสถานการณ์ในมืออย่างชัดเจน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.