2011-10-15 27 views
13

Tôi vừa cập nhật dự án để tận dụng ARC với công cụ chuyển đổi tích hợp Xcode 4.2. Thật không may có một lỗi lạ xuất hiện mà tôi không hiểu và không tìm thấy bất cứ điều gì về. Tôi có một lớp tài liệu với một tuyên bố sở hữu:Thuộc tính IBOutlet ARC và yếu

@property (weak) IBOutlet WebView *webView; 

Trong tập tin thực hiện Tôi có một tuyên bố @synthesize:

@synthesize webView=_webView; 

Khi tôi cố gắng biên dịch nó, nó không thành công và nói với tôi:

error: @synthesize of 'weak' property is only allowed in ARC or GC mode

Tất nhiên dự án được gắn thẻ để biên dịch với ARC. Tôi đánh giá cao sự giúp đỡ nào để hiểu những gì tôi đang làm sai và tại sao.

Chỉnh sửa: Đã trễ ngày hôm qua. Vì vậy, đây là bản ghi biên dịch hoàn chỉnh hơn:

[...] -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wmissing-prototypes -Wreturn-type -Wparentheses -Wswitch -Wno-unused-parameter -Wunused-variable -Wunused-value -Wshorten-64-to-32 -DDEBUG=1 -isysroot /Developer/SDKs/MacOSX10.7.sdk -fasm-blocks -mmacosx-version-min=10.7 -gdwarf-2 -Wno-sign-conversion "-DIBOutlet=attribute((iboutlet))" "-DIBOutletCollection(ClassName)=attribute((iboutletcollection(ClassName)))" "-DIBAction=void)attribute((ibaction)" -iquote [...]/Build/Intermediates/[...].build/Debug/[...].build/[...]-generated-files.hmap -I[...]/Build/Intermediates/[...].build/Debug/[...].build/[...]-own-target-headers.hmap -I[...]/Build/Intermediates/[...].build/Debug/[...].build/[...]-all-target-headers.hmap -iquote [...]/Build/Intermediates/[...].build/Debug/[...].build/[...]-project-headers.hmap -I[...]/Build/Products/Debug/include -I[...]/Build/Intermediates/[...].build/Debug/[...].build/DerivedSources/x86_64 -I[...]/Build/Intermediates/[...].build/Debug/[...].build/DerivedSources -F[...]/Build/Products/Debug -fno-objc-arc [...]

Dường như cài đặt trình biên dịch cho ARC được bật trong đầu và tắt lại sau trong danh sách đối số. Thành thật mà nói: Tôi không biết nơi để loại bỏ các cài đặt kỳ lạ như vậy và làm thế nào nó đến này. Giải pháp duy nhất tôi sẽ đưa ra bây giờ, sẽ là bắt đầu dự án hoàn chỉnh từ một dự án trống và mới và nhập tất cả các tệp lớp từ đầu.

Nếu ai đó biết một cách dễ dàng hơn, tôi sẽ đánh giá cao rất nhiều.

PS: Tôi có tất cả các cài đặt xây dựng liên quan đến ARC được đặt thành CÓ.

+1

Điều gì xảy ra khi bạn xóa (yếu)? – Phlibbo

+2

Kiểm tra kỹ cài đặt bản dựng của bạn. Nhấp vào dự án của bạn trong trình điều hướng tệp, chọn tab "Cài đặt xây dựng" và tìm kiếm "Tính năng tham chiếu tự động". Sau đó, đảm bảo trường cho "Đếm tham chiếu tự động mục tiêu C++" được đặt thành Có. –

+0

@Philibbo: Nếu tôi xóa phần mềm yếu và thay thế bằng chỉ định, mọi thứ sẽ biên dịch. Có đúng không, khi tôi cho rằng tệp này dường như bị loại trừ khỏi ARC bằng cách nào đó? – Jacque

Trả lời

1

Tôi đã dành nhiều thời gian hơn hôm nay và đã thực hiện chuyển đổi mới từ cam kết trước đó của dự án. Lần này mọi việc suôn sẻ. Tôi cho rằng lỗi này xuất hiện trong số tôi đang cố thực hiện chuyển đổi trong 2 bước riêng biệt. Dự án được chia thành 2 thành phần. Tôi muốn chuyển đổi chúng một cách riêng biệt. Đó là lý do tại sao tôi không chọn tất cả các tệp trong lần chạy chuyển đổi đầu tiên. Ngạc nhiên thay đổi đầu tiên của tôi chạy rất không đau đớn và trong thời gian ngắn hơn tôi mong đợi. Vì vậy, tôi quyết định chuyển đổi thành phần thứ hai của dự án. Những gì tôi đã kết thúc với, là trạng thái dự án mô tả như là vấn đề ở trên: xung đột xây dựng-cài đặt.

Một lời khuyên hữu ích có thể không cố gắng chuyển đổi dự án theo các bước, nhưng mất thêm một vài thời gian và làm điều đó cùng một lúc. Tôi phải giả định: chức năng chuyển đổi của Xcode có thể không có nghĩa là cho một thủ tục như vậy.

+2

Đây không phải là trí tuệ thực sự. Nếu bạn chuyển đổi theo các bước, bạn sẽ cần đặt cờ -fno-objc-arc trên các tệp bạn đã loại trừ khỏi bước chuyển đổi ban đầu của mình. Trình biên dịch đã phàn nàn b/c các tệp chưa tuân thủ ARC không được gắn cờ như vậy. Bài đăng này bao gồm nó hoàn toàn >> http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/ – pchap10k

6

FYI: Đối với bất cứ ai khác cản bởi "@synthesize tài sản 'yếu' chỉ được phép trong ARC hoặc GC chế độ" lỗi:

Nếu bạn đã thử tất cả các giải pháp đề xuất trong chủ đề này và nó vẫn sẽ không xây dựng, hãy thử đóng dự án Xcode (Tệp> Đóng dự án), sau đó mở lại dự án và thử xây dựng lại.

0

Trong trường hợp bất cứ ai khác tình cờ trên này:

Tôi chỉ cố định vấn đề này bằng cách thiết lập "Garbage Collection Objective-C" để "không được hỗ trợ" trong Cài đặt Xây dựng. Điều này đã được đặt thành CÓ vì một số lý do và điều đó gây ra việc xây dựng ARC không hoạt động.

2

Đối với bất kỳ ai khác tham gia vào điều này, nếu bạn chuyển đổi dự án của mình thành các phần của ARC, hãy xác minh bạn không có cờ -no-obj-arc trên các tệp mà họ đang phàn nàn.

0

Ok, chỉ trong trường hợp bất kỳ ai khác có cùng vấn đề với tôi, tôi đã thêm phần tử giao diện người dùng làm thuộc tính bên dưới dấu đóng "}" của @interface của tôi, thay vì bên trong. Khi tôi đã xóa các mục @property và @synthesize trong các tệp .h/.m và liên kết lại các phần tử giao diện người dùng trong phần @interface {}, nó hoạt động.

1

Thử đánh dấu một cách rõ ràng với -fobjc-arc như cờ biên dịch trong giai đoạn xây dựng

11

Chỉ trong ARC chúng ta phải sử dụng weak bất động sản và trong không ARC chúng ta phải sử dụng unsafe_unretained nó là cùng một phương tiện để ARC chúng ta phải sử dụng

@property (weak) IBOutlet WebView *webView; 

và không ARC

@property(unsafe_unretained) IBoulet WebView *webView; 
0

Trong trường hợp của tôi, tôi thấy rằng việc thay đổi xây dựng Thiết lập "biên dịch cho C/C++/Objective-C "trong danh mục" Build Options "để mặc định (" Apple LLVM compiler 3.0 ") giải quyết vấn đề này.

Nó đã được đặt thành "LLVM GCC 4.2", và tiếp tục xuống dưới danh mục '... complier 3.0 - Ngôn ngữ', tùy chọn để chọn ARC ("Mục tiêu tham chiếu tự động-C") thậm chí không có thể nhìn thấy. Điều này đặc biệt kỳ lạ vì tôi có một dự án khác được chuyển đổi thành ARC, và trong khi trình biên dịch được chọn cũng là "LLVM GCC 4.2", dù sao danh mục 'Ngôn ngữ' vẫn có tiêu đề 'Trình biên dịch 3.0 của Apple LLVM' và tùy chọn để chọn ARC hiển thị.

Cùng một trình biên dịch được chọn, nhưng các tùy chọn khác nhau được cung cấp cho trình biên dịch đó. Kỳ dị.

0

Tôi cũng gặp phải vấn đề tương tự. Sai lầm tôi đã cam kết là trong Build Phases-> Compile Sources, tôi đặt cờ của một tệp không phải là ARC là "-fno-objc-arc". Tôi muốn nó được thêm vào một tập tin không ARC. Tôi đã xóa nó và nó bắt đầu hoạt động chính xác.

Các vấn đề liên quan