ปิดใช้งานการนับการอ้างอิงอัตโนมัติสำหรับบางไฟล์


183

ฉันดาวน์โหลด iOS 5 SDK แล้วและพบว่า ARC เป็นคุณสมบัติที่ยอดเยี่ยมของ Apple คอมไพเลอร์ตัวใหม่ ในขณะนี้กรอบงานของบุคคลที่สามจำนวนมากไม่รองรับ ARC ฉันสามารถใช้ ARC สำหรับรหัสใหม่ของฉันและไม่ให้รหัสการเก็บ / ปล่อยปัจจุบันไม่เปลี่ยนแปลงได้หรือไม่? ตัวแปลง ARC ไม่ทำงานที่นี่เนื่องจากเฟรมเวิร์กบางตัวเช่น JSONKit ไม่สามารถแปลงเป็น ARC ได้โดยใช้ตัวแปลง

แก้ไข:

คำตอบคือการเพิ่ม-fno-objc-arcการรวบรวมธงสำหรับไฟล์ที่คุณไม่ต้องการ ARC ใน Xcode 4 คุณสามารถทำได้ภายใต้เป้าหมายของคุณ -> Build Phases -> Compile Sources



2
เพื่อชี้แจงคุณเพียงแค่เพิ่มลงใน.mไฟล์ ไม่ใช่.hไฟล์
ma11hew28

ฉันได้พบบทสนทนานี้: github.com/gowalla/AFNetworking/issues/36บางทีมันอาจช่วยคนอื่นวิธีรวม JSONKit ใน iOS5 ARC สนับสนุนโครงการ ;-) แต่ฉันยังไม่ได้ลองตอนนี้ ...

วิธีนี้ใช้ได้ผลสำหรับฉัน ฉันกำลังเพิ่ม AsyncUdpSocket สำหรับ UDP Multicast ให้กับโครงการของฉันและไฟล์เหล่านั้น (อย่างน้อยรุ่นปัจจุบัน) ไม่รองรับ ARC ดังนั้นฉันจึงใช้วิธีการด้านบนเพื่อเพิ่มการตั้งค่าสถานะคอมไพเลอร์ในไฟล์ AsyncUdpSocket.m และฉันสามารถรับรหัสเพื่อให้ทำงานได้ดีกับแอปพลิเคชันของฉัน
Ashu Joshi

2
มันทำงานได้อย่างสมบูรณ์แบบ! ข้อมูลเฉพาะ: ไปที่เป้าหมายของคุณและเลือกสร้างเฟสจากนั้นรวบรวมแหล่งที่มา หากคุณดับเบิลคลิกที่ไฟล์. m ที่มีปัญหาไฟล์จะปรากฏขึ้นมาซึ่งคุณสามารถพิมพ์ / วาง: "-fno-objc-arc"
mpemburn

คำตอบ:


73

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

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

เอกสารเดียวกันนั้นค่อนข้างชัดเจนว่าคุณสามารถรวมไลบรารี / กรอบงานที่ไม่ใช่ ARC เข้ากับโปรแกรม ARC: ใช่ ไม่ได้กล่าวถึงว่าคุณสามารถใช้ ARC library / frameworks ในโปรแกรมที่โค้ดของคุณไม่ใช่แบบ ARC หรือไม่ แต่จากทั้งหมดที่กล่าวมาข้างต้นความหมายดูเหมือนจะใช่


ขอบคุณ! ฉันหาวิธีปิดการใช้งาน ARC สำหรับคลาสที่ไม่ใช่ ARC ที่มีอยู่แล้ว
ไม่ใช่

คุณสามารถแบ่งปันกับเราว่าคุณกำลังทำอะไรอยู่?
David H

1
@David H: ถ้าคุณต้องการที่จะพูดกับผู้ถามคุณควรทราบว่าผู้ถามแก้ไขวิธีแก้ปัญหาของพวกเขาในคำถาม
Peter Hosey

การรวบรวม ARC ไม่สามารถปิดการใช้งานในไฟล์ HEADER เสียงดังกราวจะไม่รวบรวมอินเทอร์เฟซ / ส่วนหัวโดยยึดตามการรวบรวมไฟล์การนำไปใช้งาน / เมธอดของมัน ดังนั้นไฟล์ส่วนหัวจะต้องเข้ากันได้กับทั้ง ARC และไม่ใช่ ARC ในการรวบรวมแบบผสม ฉันคิดว่านี่เป็นข้อบกพร่องในคอมไพเลอร์
carmin

1
@carmin: ไม่ใช่ คอมไพเลอร์ไม่ได้ดูไฟล์ส่วนหัวยกเว้นเมื่อคุณบอกไฟล์ซึ่งโดยปกติแล้วคุณจะทำได้โดยการนำ#importไฟล์เหล่านั้นจากไฟล์โมดูล การตั้งค่าสถานะคอมไพเลอร์สำหรับแต่ละไฟล์โมดูล (แม่นยำยิ่งขึ้นแต่ละไฟล์ในเฟสการสร้าง“ คอมไพล์แหล่ง”) คอมไพเลอร์ไม่มีทางรู้ว่ามันควรจะใช้ ARC หรือไม่สำหรับไฟล์อื่น ๆ ยกเว้นโดยการสืบทอดตัวเลือกที่ได้รับสำหรับไฟล์โมดูลที่เริ่มต้นด้วย
ปีเตอร์โฮเชยา

78

มันไม่ง่ายนักที่จะปิดการใช้งาน ARC ในหลายไฟล์ในขณะที่ฉันทำทีละตัวจนกระทั่งรู้วิธีการทำ

  1. เลือกไฟล์ที่ต้องการที่เป้าหมาย / สร้างเฟส / คอมไพล์ซอร์สใน Xcode (CMD + คลิกหรือ Shift + คลิก)
  2. กด ENTER (ดับเบิลคลิกจะรีเซ็ตการเลือกดังนั้นจึงไม่ทำงาน)
  3. พิมพ์-fno-objc-arc
  4. กด Enter หรือเสร็จสิ้น

1
มันไม่ใช่คำตอบสำหรับคำถามที่ถามที่นี่จริง ๆ แต่เป็นคำแนะนำที่ดี โหวต +1
Kristof Van Landschoot

คุณพูดถูกใช่มั้ย แต่ฉันมักจะทำเพื่อสวิตช์และคำตอบนี้เป็นหนึ่งในเพลงยอดนิยม ฉันคิดว่าทุกวันนี้คนส่วนใหญ่รู้คำตอบอยู่แล้ว แต่ไม่ใช่ "เคล็ดลับ" นี้
Tibidabo

35

หากคุณต้องการปิดการใช้งานการนับการอ้างอิงอัตโนมัติสำหรับบางไฟล์มันง่ายมากที่จะทำตามขั้นตอนคุณสามารถเพิ่มธงคอมไพเลอร์ในเป้าหมาย -> Build Phases -> คอมไพล์ซอร์ส

Xcode

ธงที่ใช้คือ-fno-objc-arcกด Enter หลังจากเขียนมัน! คุณต้องดับเบิลคลิกที่คอลัมน์ด้านขวาของแถวภายใต้ Compiler Flags หวังว่าจะช่วยขอบคุณ :)


14
คุณสามารถใช้วิธีการเดียวกันเพื่อเปิดใช้งาน ARC ในไฟล์ที่ระบุในโครงการที่ไม่ใช่ ARC โดยใช้แฟล็-fobjc-arc
lnafziger

การรวบรวม ARC ไม่สามารถปิดการใช้งานในไฟล์ HEADER เสียงดังกราวจะไม่รวบรวมอินเทอร์เฟซ / ส่วนหัวโดยยึดตามการรวบรวมไฟล์การนำไปใช้งาน / เมธอดของมัน ดังนั้นไฟล์ส่วนหัวจะต้องเข้ากันได้กับทั้ง ARC และไม่ใช่ ARC ในการรวบรวมแบบผสม ฉันคิดว่านี่เป็นข้อบกพร่องในคอมไพเลอร์
carmin

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