Xcode 7.3 ไม่สามารถสร้างการอ้างอิง __weak ในไฟล์โดยใช้การนับการอ้างอิงด้วยตนเอง


86

หลังจากอัปเดตเป็น Xcode 7.3 จะแสดงข้อผิดพลาดCannot create __weak reference in file using manual reference countingในไฟล์พ็อด มีใครแก้ปัญหานี้ได้บ้าง?

คำตอบ:


177

ตั้งค่าBuild Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Releaseเป็นYES.

ตัวอย่างภาพ

นำมาจากฟอรัมนักพัฒนาของ Apple - Xcode 7.3b4 ไม่ใช่ส่วนโค้งไม่สามารถสร้างการอ้างอิง __weakได้


7
สิ่งนี้ยังใช้ไม่ได้สำหรับฉัน :( อาจมี-Wall -Wextra -Wno-unused-parameterแฟล็กคอมไพเลอร์อื่นที่แทนที่การตั้งค่านี้ที่ฉันอาจเปิดใช้งานได้หรือไม่ฉันเปิดใช้งานแฟล็กคำเตือนเหล่านี้
Kdawgwilk

6
@Kdawgwilk คุณแน่ใจว่าคุณเปิดธงถูกต้องหรือไม่? หากอยู่ในโครงการของคุณคุณสามารถลบ __weak keyword tho ได้ ฉันไม่ได้ลอง แต่คุณสามารถลองเปิดแฟ
ล็ก

3
โปรดทราบว่าคุณกำลังเรียกใช้การอัปเดตการติดตั้งพ็อด / การอัปเดตพ็อดการอ้างอิงที่อ่อนแอในการรีลีสการเก็บรักษาด้วยตนเองจะถูกตั้งค่าเป็นไม่สำหรับแต่ละเป้าหมายของพ็อดและคุณจะต้องแก้ไขการตั้งค่าการสร้างอีกครั้ง
Damo

2
ฉันต้องทำสิ่งนี้ในการตั้งค่าโครงการพ็อดด้วย
Bernard

พวกคำตอบที่ยอดเยี่ยม
BartłomiejSemańczyk

21

นี่คือคำตอบอย่างเป็นทางการจาก Apple จากลิงค์:

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

โดยพื้นฐานแล้วหากคุณใช้ Pod สำหรับไลบรารีของบุคคลที่สามคุณต้องลบ __weak ในที่ไม่ใช่ ARC หรือรอการอัปเดต

อัปเดต @ 23/3

ฉันควรหาข้อมูลเพิ่มเติมเกี่ยวกับแฟล็กที่ฉันสามารถส่งผ่านไปยังผู้ปฏิบัติตามเพื่อข้ามสิ่งเหล่านี้ได้ แต่โดยพื้นฐานแล้วคุณไม่ควรใช้__weakในโหมดที่ไม่ใช่ ARC นับจากนี้เพื่อหลีกเลี่ยงความขัดแย้งที่ไม่คาดคิด สำหรับผู้ใช้ cocoapods คุณไม่จำเป็นต้องลบ__weakหรือรอการอัปเดต แต่ตั้งค่าWeak References in Manual Retain Releaseสถานะในการตั้งค่าการสร้างเป็นใช่เหมือนที่ Lean กล่าว หวังว่าจะช่วยได้


1
โปรดทราบว่าคุณกำลังเรียกใช้การอัปเดตการติดตั้งพ็อด / การอัปเดตพ็อดการอ้างอิงที่อ่อนแอในการรีลีสการเก็บรักษาด้วยตนเองจะถูกตั้งค่าเป็นไม่สำหรับแต่ละเป้าหมายของพ็อดและคุณจะต้องแก้ไขการตั้งค่าการสร้างอีกครั้ง
Damo

20

วิธีที่ดีที่สุดในการแก้ปัญหานี้คือการเพิ่มpost_installสคริปต์ลงใน Podfile ของคุณที่ตั้งWeak References in Manual Retain Releaseค่าสถานะเป็นyesในพ็อดเป้าหมายทั้งหมดของคุณ โดยวางรหัสต่อไปนี้ที่ด้านล่างของPodfileไฟล์.

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
        end
    end
end

-fobjc-weak is not supported on the current deployment targetบางครั้งการทำผลว่าในข้อผิดพลาด คุณสามารถแก้ไขได้โดยเพิ่มตัวเลือกการกำหนดค่าอื่นบังคับให้พ็อดทั้งหมดกำหนดเป้าหมายเวอร์ชันที่คุณต้องการ ( ตามคำตอบนี้ ):

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
            config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.3'
        end
    end
end

ความคิดที่ดี! มันใช้ได้ผลสำหรับฉันเพราะฉันใช้ Cocoapods ขอบคุณ.
mginius

3
ฉันได้รับข้อผิดพลาด follwing: -fobjc- อ่อนแอไม่ได้รับการสนับสนุนในเป้าหมายการปรับใช้ปัจจุบัน
g212gs

ฉันได้รับข้อผิดพลาด -fobjc- อ่อนแอเช่นกัน แต่สามารถแก้ไขได้โดยตั้งค่าเป้าหมายการปรับใช้พ็อดทั้งหมดเป็น 8.3 (เป้าหมายการปรับใช้โครงการของฉัน) คุณสามารถทำได้ด้วยสคริปต์ตามที่แนะนำในสคริปต์ที่ 2 ด้านบน
Xys

8

วิธีแก้ปัญหาสำหรับการอ้างอิงที่อ่อนแอของ Facebook ใน FBSettings.m

สำหรับ Podfile เป็นไปได้ที่จะเขียนสคริปต์เพื่อรันหลังจากการติดตั้ง / อัปเดตพ็อดอธิบายสิ่งต่อไปนี้ที่นั่น

 
post_install do | installer |
     classy_pods_target = installer.pods_project.targets.find {| target | target.name == 'Facebook-iOS-SDK'}
     classy_pods_target.build_configurations.each do | config |
         config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
     end
 end

CLANG_ENABLE_OBJC_WEAK วิธีค้นหาคำพูดของเวทมนตร์นั้น XHTML ที่ถูกต้อง.


1
หมายเหตุ: ดูเหมือนว่า FB ได้เปลี่ยนบรรทัดที่ละเมิดใน v3.24.4 สำหรับบรรทัดเผยแพร่ 3.x (ไม่แน่ใจเกี่ยวกับซีรีส์ 4.x แต่ดูเหมือนตอนนี้จะไม่มีแล้ว)
big_m

7

ฉันได้พบสิ่งนี้

ฉันเดาว่ามันหมายถึงลบ __weak

https://forums.developer.apple.com/thread/38934

เอิ่มเคยมีสิ่งที่เป็นการอ้างอิงตัวแปรที่อ่อนแอภายใต้ MRR [manual Retirement-release] ไหม "__weak" หมายถึงหนึ่งหรือทั้งสองอย่าง:

  1. ข้อมูลอ้างอิงที่ไม่เป็นที่รู้จัก (กล่าวคือไม่ได้แสดงถึงจำนวนที่คงไว้)

  2. การอ้างอิงเป็นศูนย์ (กล่าวคือรันไทม์เป็นศูนย์เมื่ออ็อบเจ็กต์ที่อ้างอิงถูกยกเลิกการจัดสรร)

# 1 ใช้ไม่ได้กับ MRR เพราะคุณไม่ได้เก็บตัวแปรไว้

# 2 ใช้ไม่ได้กับ MRR เช่นกันเนื่องจากการสนับสนุนรันไทม์อยู่ใน GC และ ARC [การนับการอ้างอิงอัตโนมัติ] ซึ่งคุณไม่ได้ใช้

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


1

เพียงแค่ไปที่เป้าหมายของคุณในแท็บ "Build Phases" ให้มองหาไฟล์พ็อดใน "Compile Sources" คลิกไฟล์เหล่านั้นและเพิ่มแฟล็กคอมไพเลอร์ "-fobjc-arc"


0

หรือเปลี่ยน__weakเป็น__unsafeunretained. วิธีนี้จะแก้ปัญหาตามประเพณี เนื่องจาก MRC (ก่อน xCode 4 -) __weak ไม่ได้อยู่ใน iOS

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