2013-02-09 14 views
5

में उद्देश्य-सी ऑब्जेक्ट का उपयोग करते समय एआरसी त्रुटि को ठीक करना मुझे अपने एक्सकोड प्रोजेक्ट के साथ कोई समस्या है।संरचना

मैं इन पंक्तियों के होते हैं:

typedef struct 
{ 
    NSString *escapeSequence; 
    unichar uchar; 
} 

और मैं इस त्रुटि हो रही है:

ARC forbids Objective-C objects in structs or unions.

मैं इसे कैसे ठीक कर सकते हैं?

मुझे यह नहीं लगता कि यह एआरसी का उल्लंघन कैसे करता है लेकिन मुझे सीखना अच्छा लगेगा।

+0

[(एआरसी) structs में ऑब्जेक्टिव-सी वस्तुओं के लिए वैकल्पिक] के संभावित डुप्लिकेट (http: // stackoverflow। कॉम/प्रश्न/10055404/वैकल्पिक-से-उद्देश्य-सी-ऑब्जेक्ट्स-इन-structs-arc) –

+0

इसके अलावा: [एआरसी फ़ाइल -फनो-ओबीजेसी-आर्क को चिह्नित करने के बावजूद structs या यूनियनों में उद्देश्य-सी ऑब्जेक्ट को रोकता है] (http: //stackoverflow.com/questions/8093099/arc-forbids-objective-c-objects-in-structs-or-unions-despite-marking-the-file-f), [एआरसी के साथ structs में उद्देश्य सी कक्षाएं] (http://stackoverflow.com/questions/10851870/objective-c-classes-in-structs-with-arc), [एआरसी दस्तावेज] (http: // clang। llvm.org/docs/AutomaticReferenceCounting.html#ownership-qualified-fields-of-structs-and-unions)। –

+0

भाई, क्या आपने उपरोक्त कोड का उपयोग एपब पाठक के लिए किया था। यदि ऐसा है तो कृपया मुझे आर्क में बदलने के लिए मार्गदर्शन करें। यह मेरे लिए बेहद सहायक होगा। –

उत्तर

26

इसे करने के लिए परिवर्तित करें:

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

लेकिन, मैं निम्नलिखित 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

मैं सिर्फ एक ही कोड गूगल उपकरण बॉक्स से मेरी परियोजना में मैक

GTMNSString-HTML.m

उनके सुझाव

के लिए ARC Compatibility के लिए -fno-objc-arc ध्वज जोड़ने के लिए प्रत्येक फाइल मेरे लिए काम किया एकीकृत।

+0

भाई, क्या आपने उपरोक्त कोड का उपयोग एपब पाठक के लिए किया था। यदि ऐसा है तो कृपया मुझे आर्क में बदलने के लिए मार्गदर्शन करें। यह मेरे लिए बेहद सहायक होगा .... –

5

सबसे सुरक्षित तरीका __unsafe_unretained या सीधे CFTypeRef उपयोग करने के लिए और फिर __bridge, __bridge_retained और __bridge_transfer का उपयोग करें।

, उदा,

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

हम साथ एआरसी सक्षम उद्देश्य सी में सी संरचना को परिभाषित कर रहे हैं, हम त्रुटि "एआरसी struct में ऑब्जेक्टिव-सी वस्तुओं की मनाही" मिलता है। उस स्थिति में, हमें कीवर्ड __unsafe_unretained का उपयोग करने की आवश्यकता है।

उदाहरण

struct Books{ 

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

सही तरह से परियोजनाओं सक्षम एआरसी में उपयोग करने के लिए:

struct Books{ 

    __unsafe_unretained NSString *title; 
    __unsafe_unretained NSString *author; 
    __unsafe_unretained NSString *subject; 
    int book_id; 
}; 
संबंधित मुद्दे