Sau khi cập nhật lên Xcode 7.3, nó sẽ gây ra lỗi Cannot create __weak reference in file using manual reference counting
trong các tệp nhóm. Có ai giải quyết vấn đề này?
Câu trả lời:
Đặt Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release
thành YES
.
Đây là câu trả lời chính thức từ Apple từ liên kết:
Sự cố này hoạt động như dự định dựa trên những điều sau: Chúng tôi đang trong quá trình triển khai các tham chiếu yếu trong tất cả các chế độ ngôn ngữ Objective-C. Vì “__weak” trước đây bị bỏ qua trong các chế độ ngôn ngữ không phải ARC (và không phải GC), chúng tôi đã thêm lỗi này để chỉ ra những nơi ngữ nghĩa sẽ thay đổi trong tương lai. Vui lòng cập nhật báo cáo lỗi của bạn để cho chúng tôi biết nếu đây vẫn là sự cố đối với bạn.
Vì vậy, về cơ bản, nếu bạn đang sử dụng Pod cho các thư viện của bên thứ 3, bạn phải xóa __weak trong không phải ARC hoặc chờ cập nhật.
Cập nhật @ 3/23
Tôi nên nghiên cứu thêm về các cờ mà tôi có thể chuyển tới trình biên dịch để vượt qua những thứ này. Nhưng về cơ bản bạn không nên sử dụng __weak
ở chế độ không phải ARC từ bây giờ để tránh mọi xung đột không mong muốn. Đối với người dùng cocoapods, bạn không cần phải xóa __weak
hoặc chờ cập nhật mà đặt Weak References in Manual Retain Release
cờ trong cài đặt xây dựng thành CÓ như Lean đã nói. Hy vọng điều này giúp đỡ.
Cách tốt nhất để giải quyết vấn đề này là thêm một post_install
tập lệnh vào Podfile của bạn để đặt Weak References in Manual Retain Release
cờ cho yes
tất cả các mục tiêu nhóm của bạn. Để làm điều đó, chỉ cần dán mã sau vào cuối của bạn 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
Đôi khi, làm điều đó dẫn đến lỗi -fobjc-weak is not supported on the current deployment target
. Bạn có thể giải quyết điều đó bằng cách thêm một tùy chọn cấu hình khác, buộc tất cả các nhóm nhắm mục tiêu phiên bản bạn muốn ( dựa trên câu trả lời này ):
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
Giải pháp cho các tham chiếu yếu của Facebook trong FBSettings.m
Đối với Podfile, có thể viết một tập lệnh để chạy sau khi cài đặt / cập nhật pod, mô tả phần sau ở đó.
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 làm thế nào để tìm các từ kỳ diệu đó. .
Tôi đã tìm thấy điều này.
Tôi đoán nó có nghĩa là xóa __weak
https://forums.developer.apple.com/thread/38934
Erm, đã bao giờ có thứ gọi là tham chiếu biến yếu theo MRR [phát hành giữ lại thủ công] chưa? "__weak" có nghĩa là một hoặc cả hai điều:
Tham chiếu không xác định (nghĩa là không đại diện cho số lượng lưu giữ).
Một tham chiếu zeroing (nghĩa là thời gian chạy bằng 0 khi đối tượng được tham chiếu được phân bổ).
# 1 không áp dụng cho MRR, bởi vì bạn không giữ lại biến.
# 2 cũng không áp dụng cho MRR vì hỗ trợ thời gian chạy trong GC và ARC [đếm tham chiếu tự động] mà bạn không sử dụng.
Có vẻ như trình biên dịch bây giờ chỉ phàn nàn rằng nó không thể làm những gì nó không bao giờ có thể làm. (Và trong trường hợp là đại biểu ứng dụng, bạn sẽ không thể phân biệt được sự khác biệt tại thời điểm chạy, vì đại biểu ứng dụng nói chung không bao giờ được phân bổ.)
Hoặc thay đổi __weak
thành __unsafeunretained
. Điều này sẽ giải quyết vấn đề trong truyền thống. Vì MRC (trước xCode 4 -) __weak không có trong iOS.
-Wall -Wextra -Wno-unused-parameter
Cờ Cảnh báo được kích hoạt.