ARC ห้ามอ็อบเจ็กต์ Objective-C ในโครงสร้างหรือยูเนี่ยนแม้จะทำเครื่องหมายไฟล์ -fno-objc-arc


85

ARC ห้ามวัตถุ Objective-C ในโครงสร้างหรือสหภาพแรงงานแม้จะทำเครื่องหมายไฟล์ -fno-objc-arc? ทำไมจึงเป็นเช่นนั้น?

ฉันมีข้อสันนิษฐานว่าถ้าคุณทำเครื่องหมาย -fno-objc-arc คุณจะไม่มีข้อ จำกัด นี้

คำตอบ:


170

หากคุณได้รับข้อความนี้ให้ลอง __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;

4
นอกจากนี้ยังสร้างปัญหาเมื่อฉันจัดสรรสตริงซึ่งแสดงคำเตือนการกำหนดอ็อบเจ็กต์ที่เก็บไว้ให้กับอ็อบเจ็กต์ตัวแปร unsafe_unretained จะถูกปล่อยหลังจากการกำหนด และเมื่อฉันใช้มันขัดข้อง
Deepak Singh Negi

8
วิธีนี้ไม่ได้ช่วยแก้ปัญหาทั้งหมดโดยปกติวัตถุจะถูกปล่อยออกทันทีจึงไม่สามารถใช้งานได้
Diziet

ใช่ - วิธีนี้ใช้ไม่ได้จริง ... วิธีแก้ปัญหาคือปิด ARC สำหรับไฟล์ต้นฉบับที่ได้รับมาซึ่งฉันยังไม่สามารถเข้าใจได้ ...
nielsbot

1
คุณทำได้โดยการเพิ่มแฟล็ก -fno-objc-arc ลงในไฟล์ในขั้นตอนการสร้าง
Abizern

จะเกิดอะไรขึ้นถ้าเขตข้อมูล struct เป็นเพียง "การอ้างอิงที่โง่เขลา" และวัตถุนั้นถูกเก็บรักษาไว้ที่อื่น (พูดภายใน an NSArray) ในกรณีนี้จะไม่ถูกจัดสรรทันที แต่ฉันสงสัยว่าคอมไพเลอร์จะพูดอะไร (ไม่สามารถทดสอบได้ในตอนนี้) ...
Nicolas Miari

30

แต่กว่าการใช้structคุณสามารถสร้างระดับ Objective-Cในการจัดการข้อมูลแทน


ยังไง ตัวอย่างอยู่ที่ไหน

เหตุใดโครงสร้างสำหรับกรณีการใช้งานขนาดเล็กไม่ได้?
Devanshu Saini

13

นั่นเป็นเพราะส่วนโค้งไม่สามารถติดตามวัตถุในโครงสร้างหรือสหภาพแรงงานได้ (เนื่องจากอยู่ที่จุดนั้นพอยน์เตอร์ C ธรรมดา)

แม้ว่าคุณจะทำเครื่องหมายไฟล์ / คลาสที่เป็นปัญหา แต่ -fno-objc-arcคุณอาจยังคงส่งผ่านวัตถุที่ควบคุมโดย arc ไปเป็นพารามิเตอร์ซึ่งส่วนใหญ่จะส่งผลให้หน่วยความจำรั่ว


แต่แล้วฉันจะใช้ไฟล์ arc และ non-arc ในโปรเจ็กต์ของฉันได้อย่างไร ตัวอย่างเช่นฉันใช้ sharekit เป็น non-arc และฉันสามารถใช้อินสแตนซ์เพื่อเผยแพร่ได้ ไฟล์ที่ฉันใช้เป็นไฟล์ arc
Zsolt

คุณสามารถใช้-fno-objc-arcเพื่อผสมไฟล์ ARC และไฟล์ที่ไม่ใช่ ARC ภายในโปรเจ็กต์ แต่ถ้าคุณใช้โครงสร้าง C ธรรมดาเช่นโครงสร้างหรือยูเนี่ยนที่ใดก็ได้คุณจะไม่สามารถใช้ ARC ได้เลย
voidStern

ขอบคุณ voidStern .. "แต่ถ้าคุณใช้โครงสร้าง C ธรรมดาเช่น struct หรือ union ที่ใดก็ได้คุณจะไม่สามารถใช้ ARC ได้เลย" - ฉันไม่คิดว่านี่เป็นเรื่องจริง ฉันใช้ ARC สำหรับไฟล์ของฉันเอง และไม่ใช่ส่วนโค้งสำหรับไฟล์ libharu วิธีที่ฉันแก้ไขปัญหาเดิมของฉันคือการส่งค่าแยกกันไปยังไฟล์ C และสร้างโครงสร้างที่นั่น ฉันคิดว่ากุญแจสำคัญคือการกระโดดจากส่วนโค้งไปยังส่วนที่ไม่ใช่ส่วนโค้งไปยังส่วนโค้ง
Zsolt

1
ทั้งหมดอาจจะเกินจริงเล็กน้อย โดยพื้นฐานแล้วคุณไม่สามารถใส่พอยน์เตอร์ให้กับอ็อบเจ็กต์ในโครงสร้างและยูเนี่ยนได้ซึ่งจะทำให้ ARC สับสน การใช้ไลบรารี C ธรรมดาที่มีโครงสร้างและ / หรือสหภาพแรงงานควรเป็นไปได้ (โดยปกติ)
voidStern

6

ดูเหมือนตอนนี้จะใช้งานได้โดยไม่มีข้อผิดพลาดซึ่งอาจเกิดขึ้นหลังจากการเปลี่ยนแปลงนี้

กล่าวคือคุณสามารถใส่พอยน์เตอร์ปกติ (แข็งแรง) ให้กับอ็อบเจ็กต์ Objective-C ในโครงสร้าง C มันถูกจัดการโดย ARC เช่นมันจะไม่กลับคืนมาเมื่อโครงสร้างถูกทำลาย ยืนยันด้วย:

$ clang --version Apple LLVM version 10.0.0 (clang-1000.11.45.2)


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