คำถามบางประการเกี่ยวกับการนับอ้างอิงอัตโนมัติใน iOS5 SDK


134

ฉันกำลังพัฒนาแอพสำหรับ iPad การพัฒนาเริ่มต้นสำหรับ iOS 4.2 และกำลังดำเนินการต่อไป (และฉันคิดว่าจะเสร็จสมบูรณ์) สำหรับ iOS 4.3 ฉันเพิ่งอ่านเกี่ยวกับ ARC ใน iOS 5 และโดยพื้นฐานแล้วฉันเข้าใจว่าเราไม่จำเป็นต้องปล่อยและเก็บรักษาวัตถุอีกต่อไป คำถามของฉันคือ:

  1. หากฉันตัดสินใจที่จะอัปเกรดเป็น iOS 5 ฉันจำเป็นต้องลบข้อความ[myObject retain]และ[myObject release]ข้อความทั้งหมดออกจากรหัสของฉันหรือไม่

  2. หากฉันพัฒนาแอปใหม่สำหรับ iOS 5 โดยใช้ ARC ฉันจะต้องใช้การตรวจสอบ "ความเข้ากันได้ย้อนยุค" บางประเภทหรือไม่ กล่าวคือฉันจะต้องตรวจสอบเวอร์ชันของ iOS และรักษาการโทรและปล่อยตามนั้นหรือไม่ โดยพื้นฐานแล้ว ARC สามารถใช้ได้กับ iOS ทุกเวอร์ชันหรือเฉพาะสำหรับ iOS 5?

คำตอบ:


150

หากฉันตัดสินใจที่จะอัปเกรดเป็น iOS 5 ฉันจำเป็นต้องลบคำสั่ง [myObjectained] และ [myObject release] ทั้งหมดออกจากรหัสของฉันหรือไม่

ใช่ แต่ XCode 4.2 มีเครื่องมือ "Migrate to Objective-C ARC" ใหม่ (ในเมนู Edit-> Refactor) ซึ่งทำเพื่อคุณ การเรียก dealloc เป็นคนละเรื่อง ดังที่กล่าวไว้ในความคิดเห็นการอ้างอิงเสียงดังระบุว่าคุณควรใช้วิธีการ dealloc ของคุณ:

เหตุผล: แม้ว่า ARC จะทำลายตัวแปรอินสแตนซ์โดยอัตโนมัติ แต่ก็ยังมีเหตุผลที่ถูกต้องในการเขียนเมธอด dealloc เช่นการปลดปล่อยทรัพยากรที่ไม่สามารถเก็บรักษาได้ การไม่โทรหา [super dealloc] ในวิธีดังกล่าวมักจะเป็นข้อบกพร่อง

คุณเปิดใช้งาน ARC โดยใช้แฟล็กคอมไพเลอร์ -fobjc-arc ใหม่ ARC ได้รับการสนับสนุนใน Xcode 4.2 สำหรับ Mac OS X v10.6 และ v10.7 (แอปพลิเคชัน 64 บิต) และสำหรับ iOS 4 และ iOS 5 (ไม่รองรับการอ้างอิงที่อ่อนแอใน MacOS X v10.6 และ iOS 4) ไม่มีการรองรับ ARC ใน Xcode 4.1

-

หากฉันพัฒนาแอปใหม่สำหรับ iOS 5 โดยใช้ ARC ฉันจะต้องใช้การตรวจสอบ "ความเข้ากันได้ย้อนยุค" บางประเภทหรือไม่ เช่น: ฉันจะต้องตรวจสอบเวอร์ชันของ iOS และรักษาการโทรและปล่อยตามนั้นหรือไม่? โดยพื้นฐานแล้ว ARC สามารถใช้ได้กับ iOS ทุกเวอร์ชันหรือเฉพาะสำหรับ iOS 5?

ไม่เพราะ ARC ใช้เวทมนตร์ในการรวบรวมเวลาไม่ใช่ในเวลาทำงาน

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

ข้อมูลเพิ่มเติมเกี่ยวกับ ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html


ขอบคุณสำหรับคำอธิบาย!
Luke47

4
สิ่งนี้ไม่ถูกต้อง 100% มีสวิตช์คอมไพเลอร์ที่กำหนดว่า ARC ถูกเปิดใช้งานหรือไม่ นอกจากนี้ ARC ยังต้องการการสนับสนุนรันไทม์ด้วยฉันเชื่อว่าดังนั้นหากคุณต้องการให้แอปของคุณทำงานบน iOS 4.x คุณจะต้องออกจากการเก็บรักษาและการเผยแพร่และตรวจสอบให้แน่ใจว่าปิด ARC แล้ว
JeremyP

8
@JeremyP - iOS 4.0 ได้รับการสนับสนุนเป็นเป้าหมายสำหรับแอปพลิเคชัน ARC ดังนั้นจึงไม่จำเป็นต้องเก็บรหัสที่นับการอ้างอิงด้วยตนเองไว้รอบ ๆ เพื่อตอบสนองแพลตฟอร์มรุ่นเก่า อาจเป็นไปได้ว่า iPhone OS 3.x แต่ฉันคิดว่า Apple อาจยุติการสนับสนุนสำหรับแพลตฟอร์มเป้าหมายนั้นเมื่อเรือ 5.0 เช่นเดียวกับที่ทำกับ 2.x เมื่อ 4.0 ออกมา
Brad Larson

5
@Brad ฐานการติดตั้งสำหรับ iOS4 มีมากกว่า 95% แล้ว ฉันคิดว่ามันประหยัดที่จะเลิกรองรับ iOS3 อยู่ดี
Henrik P. Hessel

2
คุณไม่ได้ลบdeallocคุณแค่ลบreleases ทั้งหมดของคุณและ[super dealloc]ออกจากมัน และ 99.9% deallocปล่อยวัตถุออกมาดังนั้นคุณจึงลบออก แต่อ็อบเจ็กต์ยังคงต้องดำเนินการล้างข้อมูลอื่น ๆ ซึ่งไม่ใช่release(การปิดไฟล์การลบผู้สังเกตการณ์ ฯลฯ )
Stanislav Yaglo

8

Q1: ไม่หากคุณมีโค้ดที่มีอยู่คุณสามารถใช้มันต่อไปได้เหมือนเดิมด้วย-fno-objc-arcคุณสามารถเลือกปิดใช้งาน ARC ในไฟล์ใดก็ได้

หากคุณต้องการปิดใช้งาน ARCบนไฟล์หลายไฟล์:

  1. เลือกไฟล์ที่ต้องการที่ Target / Build Phases / Compile Sources ใน Xcode
  2. กด Enter (ดับเบิลคลิกเลือกเพียงไฟล์เดียว)
  3. พิมพ์-fno-objc-arc
  4. กดEnterหรือDone

Q2: ไม่เป้าหมายอาจต่ำถึง iOS 4.0


7

เท่าที่ฉันเข้าใจและเท่าที่ iPhone / iPod ของฉันใช้ iOS 5 และ iOS 4.3 ทำงานตามลำดับทั้งหมดนั้นค่อนข้างอัตโนมัติ แอปที่ฉันเริ่มต้นสำหรับ 4.0 และได้ "อัปเดต" เพื่อทำงานกับ Xcode สำหรับ iOS 5.0 ไม่เคยแสดงคำเตือนใด ๆ เกี่ยวกับการปล่อยและการเก็บรักษาแม้ว่ามันจะครอบคลุมทุก dealloc ฯลฯ อย่างไรก็ตามโค้ดเดียวกันบางส่วนที่ฉันใส่เข้าไป (คัดลอกไฟล์) ไปยังโปรเจ็กต์ใหม่ที่สร้างด้วย Xcode สำหรับ iOS 5 มีคำเตือนมากมาย ดังนั้นดูเหมือนว่าคุณไม่จำเป็นต้องลบการโทรเหล่านั้นออกทั้งหมดและไม่มันจะปรับการโทรโดยอัตโนมัติสำหรับเวอร์ชันเก่า การทำโปรไฟล์ iPod ของฉันฉันไม่เห็นหน่วยความจำรั่วหรือสัญญาณอื่น ๆ ของการกำจัด / การปล่อยที่ล้มเหลว สิ่งนี้ช่วยได้หรือไม่?


เวอร์ชันเบต้าล่าสุดแจ้งให้ฉันลบการโทรการจัดสรรทั้งหมดและนั่นก็เกี่ยวกับเรื่องนี้ คุณยังคงสามารถเก็บ / ปล่อยได้ แต่ระบบมีคำสุดท้าย
Dylan Gattey

5

เกี่ยวกับส่วนนี้ของคำถามของคุณ

หากฉันพัฒนาแอปใหม่สำหรับ iOS 5 โดยใช้ ARC ฉันจะต้องใช้การตรวจสอบ "ความเข้ากันได้ย้อนยุค" บางประเภทหรือไม่ เช่น: ฉันจะต้องตรวจสอบเวอร์ชันของ iOS และรักษาการโทรและปล่อยตามนั้นหรือไม่? โดยพื้นฐานแล้ว ARC สามารถใช้ได้กับ iOS ทุกเวอร์ชันหรือเฉพาะสำหรับ iOS 5?

ควรสังเกตว่าคอมไพเลอร์ iOS 5 ใช้ "ความเข้ากันได้ย้อนยุค" (จริงๆแล้วมันจะเพิ่มโค้ดเพื่อทำให้การเก็บรักษา / รีลีสใช้งานได้) แต่ถ้าคุณไม่ได้รวบรวมสำหรับ iOS 5.0 คุณจะไม่สามารถใช้weakเป็นคีย์เวิร์ดได้ . แทนที่จะใช้assign. นี่เป็นโชคร้าย: weakเป็นข้อได้เปรียบอย่างมาก (ไม่มีคำชี้อันตรายเลย!) ดูคำถามของฉันที่นี่สำหรับการอภิปรายของweak, assignและ ARC


2

หากคุณสามารถปิดใช้งาน ARC ได้โดยไม่ใช้แฟล็กคอมไพเลอร์ -fobjc-arc ใหม่คุณจะไม่ถูกบังคับให้เขียนโค้ดใหม่ในอนาคต - ฉันเดา (?)

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