Xcode 7.3 không thể tạo tham chiếu __weak trong tệp bằng cách đếm tham chiếu thủ công


86

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 countingtrong các tệp nhóm. Có ai giải quyết vấn đề này?

Câu trả lời:


176

Đặt Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Releasethành YES.

Ví dụ trực quan

Lấy từ Diễn đàn dành cho nhà phát triển của Apple - Xcode 7.3b4, không phải vòng cung, không thể tạo tham chiếu __weak .


7
Điều này vẫn không làm việc cho tôi :( có thể có được một lá cờ biên dịch đó sẽ ghi đè thiết lập này mà tôi có thể đã kích hoạt tôi có những? -Wall -Wextra -Wno-unused-parameterCờ Cảnh báo được kích hoạt.
Kdawgwilk

6
@Kdawgwilk Bạn có chắc là bạn đã bật đúng lá cờ đó không? Nếu nó nằm trong dự án của bạn, bạn chỉ cần xóa __weak từ khóa tho. Tôi đã không thử nhưng bạn cũng có thể thử bật cờ trong dự án Pod nếu bạn đang sử dụng Pod
REALFREE Ngày

3
Lưu ý nếu bạn hiện đang chạy cài đặt pod / cập nhật pod thì Tham chiếu yếu trong Bản phát hành lưu giữ thủ công được đặt thành KHÔNG cho mỗi mục tiêu nhóm - và bạn sẽ phải chỉnh sửa lại cài đặt bản dựng.
Damo

2
Tôi cũng phải làm điều này trong thiết lập dự án nhóm.
Bernard

câu trả lời tuyệt vời guys.
Bartłomiej Semańczyk

21

Đâ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 __weakhoặc chờ cập nhật mà đặt Weak References in Manual Retain Releasecờ trong cài đặt xây dựng thành CÓ như Lean đã nói. Hy vọng điều này giúp đỡ.


1
Lưu ý nếu bạn hiện đang chạy cài đặt pod / cập nhật pod thì Tham chiếu yếu trong Bản phát hành lưu giữ thủ công được đặt thành KHÔNG cho mỗi mục tiêu nhóm - và bạn sẽ phải chỉnh sửa lại cài đặt bản dựng.
Damo

20

Cách tốt nhất để giải quyết vấn đề này là thêm một post_installtập lệnh vào Podfile của bạn để đặt Weak References in Manual Retain Releasecờ cho yestấ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

Ý tưởng tuyệt vời! Nó phù hợp với tôi, vì tôi đang sử dụng Cocoapods. Cảm ơn.
mginius

3
Tôi gặp lỗi follwing: -fobjc-yếu không được hỗ trợ trên mục tiêu triển khai hiện tại
g212gs

Tôi cũng gặp lỗi -fobjc-yếu, nhưng đã tìm cách khắc phục bằng cách đặt tất cả mục tiêu triển khai nhóm thành 8.3 (mục tiêu triển khai dự án của tôi). Tuy nhiên, bạn có thể làm điều đó với một script, như được đề xuất trong script thứ 2 ở trên.
Xys

8

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 đó. XHTML hợp lệ.


1
Chỉ cần lưu ý: Có vẻ như FB đã thay đổi dòng vi phạm trong v3.24.4, cho dòng phát hành 3.x. (Không chắc chắn về loạt 4.x, nhưng nó không giống như nó ở đó ngay bây giờ.)
big_m

7

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:

  1. Tham chiếu không xác định (nghĩa là không đại diện cho số lượng lưu giữ).

  2. 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ổ.)


1

Chỉ cần truy cập mục tiêu của bạn trong tab "Xây dựng giai đoạn", tìm kiếm tệp nhóm trong "Nguồn biên dịch", nhấp vào các tệp đó và thêm cờ trình biên dịch "-fobjc-arc"


0

Hoặc thay đổi __weakthà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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.