ARC ห้ามวัตถุ Objective-C ในโครงสร้างหรือสหภาพแรงงานแม้จะทำเครื่องหมายไฟล์ -fno-objc-arc? ทำไมจึงเป็นเช่นนั้น?
ฉันมีข้อสันนิษฐานว่าถ้าคุณทำเครื่องหมาย -fno-objc-arc คุณจะไม่มีข้อ จำกัด นี้
ARC ห้ามวัตถุ Objective-C ในโครงสร้างหรือสหภาพแรงงานแม้จะทำเครื่องหมายไฟล์ -fno-objc-arc? ทำไมจึงเป็นเช่นนั้น?
ฉันมีข้อสันนิษฐานว่าถ้าคุณทำเครื่องหมาย -fno-objc-arc คุณจะไม่มีข้อ จำกัด นี้
คำตอบ:
หากคุณได้รับข้อความนี้ให้ลอง __unsafe_unretained จะปลอดภัยก็ต่อเมื่อวัตถุในโครงสร้างไม่กลับคืนมา ตัวอย่าง: หากคุณใช้ OpenFeint กับ ARC คลาส OFBragDelegateStrings จะกล่าวว่าข้อผิดพลาดนี้ในโครงสร้าง
typedef struct OFBragDelegateStrings
{
NSString* prepopulatedText;
NSString* originalMessage;
} OFBragDelegateStrings;
ถึง
typedef struct OFBragDelegateStrings
{
__unsafe_unretained NSString* prepopulatedText;
__unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
NSArray
) ในกรณีนี้จะไม่ถูกจัดสรรทันที แต่ฉันสงสัยว่าคอมไพเลอร์จะพูดอะไร (ไม่สามารถทดสอบได้ในตอนนี้) ...
แต่กว่าการใช้structคุณสามารถสร้างระดับ Objective-Cในการจัดการข้อมูลแทน
นั่นเป็นเพราะส่วนโค้งไม่สามารถติดตามวัตถุในโครงสร้างหรือสหภาพแรงงานได้ (เนื่องจากอยู่ที่จุดนั้นพอยน์เตอร์ C ธรรมดา)
แม้ว่าคุณจะทำเครื่องหมายไฟล์ / คลาสที่เป็นปัญหา แต่ -fno-objc-arc
คุณอาจยังคงส่งผ่านวัตถุที่ควบคุมโดย arc ไปเป็นพารามิเตอร์ซึ่งส่วนใหญ่จะส่งผลให้หน่วยความจำรั่ว
-fno-objc-arc
เพื่อผสมไฟล์ ARC และไฟล์ที่ไม่ใช่ ARC ภายในโปรเจ็กต์ แต่ถ้าคุณใช้โครงสร้าง C ธรรมดาเช่นโครงสร้างหรือยูเนี่ยนที่ใดก็ได้คุณจะไม่สามารถใช้ ARC ได้เลย
ดูเหมือนตอนนี้จะใช้งานได้โดยไม่มีข้อผิดพลาดซึ่งอาจเกิดขึ้นหลังจากการเปลี่ยนแปลงนี้
กล่าวคือคุณสามารถใส่พอยน์เตอร์ปกติ (แข็งแรง) ให้กับอ็อบเจ็กต์ Objective-C ในโครงสร้าง C มันถูกจัดการโดย ARC เช่นมันจะไม่กลับคืนมาเมื่อโครงสร้างถูกทำลาย ยืนยันด้วย:
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)