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:
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;
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ờ) ...
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à 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-arc
bạ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ớ.
-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.
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)