ไม่มีข้อเสีย ใช้มัน. ทำวันนี้ เร็วกว่ารหัสเดิมของคุณ ปลอดภัยกว่ารหัสเดิมของคุณ ง่ายกว่ารหัสเดิมของคุณ ไม่ใช่การเก็บขยะ ไม่มีค่าใช้จ่ายรันไทม์ GC ส่วนแทรกของคอมไพเลอร์จะเก็บรักษาและเผยแพร่ในทุกที่ที่คุณควรมีต่อไป แต่ฉลาดกว่าคุณและสามารถปรับแต่งสิ่งที่ไม่จำเป็นจริงๆได้ (เช่นเดียวกับที่สามารถคลายการวนซ้ำกำจัดตัวแปรชั่วคราวฟังก์ชันอินไลน์ ฯลฯ )
ตกลงตอนนี้ฉันจะบอกคุณเกี่ยวกับข้อเสียเล็ก ๆ :
หากคุณเป็นนักพัฒนา ObjC เป็นเวลานานคุณจะกระตุกประมาณหนึ่งสัปดาห์เมื่อคุณเห็นรหัส ARC คุณจะผ่านพ้นเรื่องนี้ไปได้อย่างรวดเร็ว
มีความซับซ้อนเล็กน้อย (มาก) ในการเชื่อมโยงกับรหัส Core Foundation มีความซับซ้อนเล็กน้อยในการจัดการกับสิ่งที่ถือว่าid
เป็นvoid*
. สิ่งต่างๆเช่น C-arrays id
สามารถใช้เวลาคิดอีกเล็กน้อยเพื่อให้ทำอย่างถูกต้อง การจัดการ ObjC แบบแฟนซีva_args
อาจทำให้เกิดปัญหาได้เช่นกัน สิ่งส่วนใหญ่ที่เกี่ยวข้องกับคณิตศาสตร์บนตัวชี้ ObjC นั้นยุ่งยากกว่า คุณไม่ควรมีสิ่งนี้มากไม่ว่าในกรณีใด ๆ
คุณไม่สามารถใส่id
ไฟล์struct
. สิ่งนี้ค่อนข้างหายาก แต่บางครั้งก็ใช้ในการแพ็คข้อมูล
หากคุณไม่ปฏิบัติตามการตั้งชื่อ KVC ที่ถูกต้องและคุณผสมระหว่างรหัส ARC และไม่ใช่ ARC คุณจะมีปัญหาเกี่ยวกับหน่วยความจำ ARC ใช้การตั้งชื่อ KVC เพื่อตัดสินใจเกี่ยวกับการจัดการหน่วยความจำ หากเป็นรหัส ARC ทั้งหมดก็ไม่สำคัญเพราะจะทำให้ "ผิด" เหมือนกันทั้งสองด้าน แต่ถ้าผสม ARC / ไม่ใช่ ARC แสดงว่าไม่ตรงกัน
ARC จะรั่วไหลหน่วยความจำในระหว่างการโยนข้อยกเว้นของ ObjC ข้อยกเว้นของ ObjC ควรใกล้เคียงกับการยุติโปรแกรมของคุณ หากคุณพบข้อยกเว้น ObjC จำนวนมากแสดงว่าคุณใช้ไม่ถูกต้อง สามารถแก้ไขได้โดยใช้-fobjc-arc-exceptions
แต่จะมีบทลงโทษที่กล่าวถึงด้านล่าง:
ARC จะไม่รั่วไหลของหน่วยความจำในระหว่างข้อยกเว้นของ ObjC หรือ C ++ จะแสดงรหัส ObjC ++ แต่จะต้องเสียค่าใช้จ่ายทั้งเวลาและประสิทธิภาพของพื้นที่ นี่เป็นอีกหนึ่งเหตุผลในการลดการใช้ ObjC ++
ARC จะไม่ทำงานเลยบน iPhoneOS 3 หรือ Mac OS X 10.5 หรือรุ่นก่อนหน้า (สิ่งนี้ขัดขวางไม่ให้ฉันใช้ ARC ในหลาย ๆ โครงการ)
__weak
ตัวชี้ทำงานไม่ถูกต้องบน iOS 4 หรือ Mac OS X 10.6 ซึ่งเป็นเรื่องที่น่าเสียดาย แต่ค่อนข้างง่ายในการแก้ไข __weak
คำแนะนำนั้นยอดเยี่ยม แต่ไม่ใช่จุดขายอันดับ 1 ของ ARC
สำหรับโค้ด 95% + ARC นั้นยอดเยี่ยมและไม่มีเหตุผลใด ๆ ที่จะหลีกเลี่ยง (หากคุณสามารถจัดการกับข้อ จำกัด เวอร์ชัน OS ได้) สำหรับรหัสที่ไม่ใช่ ARC คุณสามารถส่งผ่านได้-fno-objc-arc
ต่อแบบทีละไฟล์ Xcode ทำให้สิ่งนี้ยากกว่าที่ควรจะเป็นในทางปฏิบัติ คุณควรย้ายโค้ดที่ไม่ใช่ ARC ไปไว้ใน xcodeproj แยกต่างหากเพื่อให้ง่ายขึ้น
โดยสรุปให้เปลี่ยนไปใช้ ARC โดยเร็วที่สุดและอย่ามองย้อนกลับไป
แก้ไข
ฉันได้เห็นความคิดเห็นสองสามข้อในบรรทัด "การใช้ ARC ไม่สามารถทดแทนการรู้กฎการจัดการหน่วยความจำ Cocoa ได้" นี่เป็นความจริงส่วนใหญ่ แต่สิ่งสำคัญคือต้องเข้าใจว่าทำไมและทำไมถึงไม่ทำ ขั้นแรกหากโค้ดทั้งหมดของคุณใช้ ARC และคุณละเมิด Three Magic Wordsทั่วทุกแห่งคุณจะยังไม่มีปัญหา น่าตกใจที่จะพูด แต่คุณไปแล้ว ARC อาจเก็บรักษาบางสิ่งที่คุณไม่ได้ตั้งใจที่จะรักษาไว้ แต่มันก็จะปล่อยมันออกมาเช่นกันดังนั้นมันก็ไม่สำคัญ ถ้าฉันสอนคลาสใหม่ใน Cocoa วันนี้ฉันอาจจะใช้เวลาไม่เกินห้านาทีกับกฎการจัดการหน่วยความจำจริงและฉันอาจจะพูดถึงกฎการตั้งชื่อการจัดการหน่วยความจำเท่านั้นในขณะที่พูดคุยเกี่ยวกับการตั้งชื่อ KVC ด้วย ARC ฉันเชื่อว่าคุณสามารถเป็นโปรแกรมเมอร์เริ่มต้นที่ดีได้โดยไม่ต้องเรียนรู้กฎการจัดการหน่วยความจำเลย
แต่คุณไม่สามารถเป็นโปรแกรมเมอร์ระดับกลางที่ดีได้ คุณจำเป็นต้องรู้กฎเพื่อที่จะเชื่อมโยงกับ Core Foundation ได้อย่างถูกต้องและโปรแกรมเมอร์ระดับกลางทุกคนจำเป็นต้องจัดการกับ CF ในบางจุด และคุณต้องรู้กฎสำหรับรหัสผสม ARC / MRC และคุณจำเป็นต้องรู้กฎเมื่อคุณเริ่มยุ่งกับvoid*
คำแนะนำid
(ซึ่งคุณจะต้องดำเนินการ KVO อย่างถูกต้องต่อไป) และบล็อก ... การจัดการหน่วยความจำบล็อกเป็นเรื่องแปลก
ดังนั้นประเด็นของฉันก็คือการจัดการหน่วยความจำพื้นฐานยังคงมีความสำคัญ แต่ที่ซึ่งฉันเคยใช้เวลาอย่างมีนัยสำคัญในการระบุและทบทวนกฎสำหรับโปรแกรมเมอร์ใหม่โดย ARC กำลังกลายเป็นหัวข้อขั้นสูงมากขึ้น objc_retain()
ฉันอยากจะได้รับการพัฒนาใหม่คิดในแง่ของกราฟวัตถุมากกว่าการเติมหัวของพวกเขาด้วยการโทรพื้นฐานเพื่อ