2013-02-09 26 views
5

Tôi gặp sự cố với dự án Xcode của mình.Sửa lỗi ARC khi sử dụng đối tượng Objective-C trong struct

tôi có những dòng này:

typedef struct 
{ 
    NSString *escapeSequence; 
    unichar uchar; 
} 

và tôi nhận được lỗi này:

ARC forbids Objective-C objects in structs or unions.

Làm thế nào tôi có thể sửa chữa nó?

Tôi dường như không thể tìm ra cách vi phạm ARC nhưng tôi rất muốn tìm hiểu.

+0

thể trùng lặp của [Thay thế cho đối tượng-C Mục tiêu trong cấu trúc (ARC)] (http: // stackoverflow. com/questions/10055404/alternative-to-target-c-objects-in-structs-arc) –

+0

Ngoài ra: [ARC cấm đối tượng-C trong các cấu trúc hoặc các công đoàn mặc dù đánh dấu tập tin -fno-objc-arc] (http: //stackoverflow.com/questions/8093099/arc-forbids-objective-c-objects-in-structs-or-unions-despite-marking-the-file-f), [Các lớp Objective-C trong các cấu trúc với ARC] (http://stackoverflow.com/questions/10851870/objective-c-classes-in-structs-with-arc), [tài liệu ARC] (http: // clang. llvm.org/docs/AutomaticReferenceCounting.html#ownership-qualified-fields-of-structs-and-unions). –

+0

anh trai, bạn đã sử dụng mã trên cho trình đọc epub. Nếu vậy xin hướng dẫn tôi chuyển đổi nó thành vòng cung. Nó sẽ cực kỳ hữu ích cho tôi. –

Trả lời

26

Thay đổi nó để:

typedef struct 
{ 
    __unsafe_unretained NSString *escapeSequence; 
    unichar uchar; 
}MyStruct; 

Nhưng, tôi khuyên bạn nên theo các quy tắc của Apple từ this documentation.

ARC Enforces New Rules

You cannot use object pointers in C structures.
Rather than using a struct, you can create an Objective-C class to manage the data instead.

0

Tôi chỉ tích hợp cùng mã vào dự án của tôi từ hộp công cụ của Google dành cho Mac

GTMNSString-HTML.m

đề nghị họ cho ARC Compatibility thêm các -fno-objc-arc cờ cho mỗi tập tin làm việc cho tôi.

+0

anh trai, bạn đã sử dụng mã trên cho trình đọc epub. Nếu vậy xin hướng dẫn tôi chuyển đổi nó thành vòng cung. Nó sẽ cực kỳ hữu ích cho tôi .... –

5

Cách an toàn nhất là sử dụng __unsafe_unretained hoặc trực tiếp CFTypeRef và sau đó sử dụng __bridge, __bridge_retained__bridge_transfer.

ví dụ

typedef struct Foo { 
    CFTypeRef p; 
} Foo; 

int my_allocating_func(Foo *f) 
{ 
    f->p = (__bridge_retained CFTypeRef)[[MyObjC alloc] init]; 
    ... 
} 

int my_destructor_func(Foo *f) 
{ 
    MyObjC *o = (__bridge_transfer MyObjC *)f->p; 
    ... 
    o = nil; // Implicitly freed 
    ... 
} 
0

Khi chúng ta xác định cấu trúc C trong Objective C với ARC cho phép, chúng tôi nhận được lỗi "ARC cấm đối tượng-C Mục tiêu trong struct". Trong trường hợp đó, chúng tôi cần sử dụng từ khóa __unsafe_unretained.

Ví dụ

struct Books{ 

    NSString *title; 
    NSString *author; 
    NSString *subject; 
    int book_id; 
}; 

cách chính xác để sử dụng trong ARC cho phép các dự án:

struct Books{ 

    __unsafe_unretained NSString *title; 
    __unsafe_unretained NSString *author; 
    __unsafe_unretained NSString *subject; 
    int book_id; 
}; 
Các vấn đề liên quan