ARC cấm các đối tượng Objective-C trong cấu trúc hoặc kết hợp mặc dù đánh dấu tệp -fno-objc-arc


85

ARC cấm các đối tượng Objective-C trong cấu trúc hoặc liên hiệp mặc dù đánh dấu tệp -fno-objc-arc? Tại sao cái này rất?

Tôi đã giả định rằng nếu bạn đánh dấu nó -fno-objc-arc thì bạn không có hạn chế này.

Câu trả lời:


170

Nếu bạn nhận được thông báo này, hãy thử __unsafe_unretained. Nó chỉ an toàn, nếu các đối tượng trong cấu trúc là không bị lỗi. Ví dụ: Nếu bạn sử dụng OpenFeint với ARC, Lớp OFBragDelegateStrings cho biết lỗi này trong một cấu trúc.

typedef struct OFBragDelegateStrings
{
     NSString* prepopulatedText;
     NSString* originalMessage;
} OFBragDelegateStrings;

đến

typedef struct OFBragDelegateStrings
{
     __unsafe_unretained NSString* prepopulatedText;
     __unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;

4
nó cũng tạo ra vấn đề khi tôi cấp phát chuỗi nó hiển thị cảnh báo gán đối tượng được giữ lại cho đối tượng biến không an toàn_unretained sẽ được phát hành sau khi gán. Và khi tôi sử dụng nó bị treo
Deepak Singh Negi

8
Điều này không giải quyết được tất cả các vấn đề, đối tượng thường sẽ được giải phóng ngay lập tức và do đó không khả dụng.
Diziet

vâng - điều này không thực sự làm việc ... giải pháp là bằng cách nào đó tắt ARC cho một tập tin nguồn có nguồn gốc mà tôi đã không thể tìm ra được nêu ra ...
nielsbot

1
Bạn làm điều đó bằng cách thêm cờ -fno-objc-arc vào tệp trong giai đoạn xây dựng.
Abizern

Điều gì sẽ xảy ra nếu trường struct chỉ là một "tham chiếu câm" và đối tượng thực sự đang được giữ lại (sở hữu) ở một nơi khác (giả sử bên trong một NSArray)? Trong trường hợp đó, nó sẽ không được phân bổ ngay lập tức, nhưng tôi tự hỏi trình biên dịch sẽ nói gì (không thể kiểm tra nó ngay bây giờ) ...
Nicolas Miari

30

Thay vì sử dụng cấu trúc , bạn có thể tạo một lớp Objective-C để quản lý dữ liệu.


làm sao? mẫu ở đâu?

Vậy tại sao không thể cấu trúc cho các trường hợp sử dụng nhỏ?
Devanshu Saini

13

Đó là bởi vì cung không thể theo dõi các đối tượng trong cấu trúc hoặc liên kết (vì chúng nằm ở điểm đó là con trỏ C đơn giản).

Mặc dù bạn đã đánh dấu tệp / lớp được đề cập, -fno-objc-arcbạn vẫn có thể chuyển một đối tượng được điều khiển bởi vòng cung cho nó làm tham số, điều này rất có thể dẫn đến rò rỉ bộ nhớ.


Nhưng sau đó làm cách nào để tôi có thể sử dụng các tệp cung cấp và không cung cấp trong các dự án của mình. Ví dụ: tôi sử dụng bộ chia sẻ không phải là vòng cung và tôi có thể sử dụng các phiên bản để xuất bản. Các tệp tôi đang sử dụng nó là tệp hồ quang.
Zsolt

Bạn có thể sử dụng -fno-objc-arcđể kết hợp các tệp ARC và không phải ARC trong một dự án, nhưng nếu bạn đang sử dụng cấu trúc C thuần túy như struct hoặc union ở bất kỳ đâu thì bạn hoàn toàn không thể sử dụng ARC.
voidStern

Cảm ơn voidStern .. "nhưng nếu bạn đang sử dụng cấu trúc C đơn giản như struct hoặc union ở bất kỳ đâu, bạn hoàn toàn không thể sử dụng ARC." - Tôi không nghĩ đây là sự thật. Tôi đang sử dụng ARC cho các tệp của riêng mình. Và không cung cấp cho các tệp libharu. Cách tôi giải quyết vấn đề ban đầu của mình là chuyển các giá trị riêng biệt vào tệp C và tạo cấu trúc ở đó. Tôi nghĩ mấu chốt là bước nhảy từ vòng cung sang không vòng cung sang vòng cung.
Zsolt

1
Có thể hơi phóng đại một chút. Về bản chất, bạn không thể đặt các con trỏ đến các đối tượng thành các cấu trúc và sự kết hợp, điều này sẽ gây nhầm lẫn cho ARC. Sử dụng một thư viện C đơn giản với các cấu trúc và / hoặc liên kết nên (thường) là có thể.
voidStern

6

Có vẻ như tính năng này hiện hoạt động mà không có lỗi, có thể là sau thay đổi này .

tức là, Bạn có thể đặt các con trỏ bình thường (mạnh) đến các đối tượng Objective-C trong một cấu trúc C. Nó được quản lý bởi ARC, ví dụ, nó không bị xử lý khi cấu trúc bị hủy. Đã xác minh với:

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


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.