36

मैं अपने व्यू कंट्रोलर के साथ एक संपत्ति के रूप में एक प्रेषण कतार बनाए रखता हूं। मैं अपने कतार नियंत्रक की init विधि में एक बार यह कतार बना देता हूं, और कुछ पृष्ठभूमि कार्यों के लिए कुछ बार पुन: उपयोग करता हूं। एआरसी से पहले, मैं यह कर रहा था:एआरसी के बाद डिस्पैच कतार के लिए मुझे किस संपत्ति का उपयोग करना चाहिए?

@property (nonatomic, assign) dispatch_queue_t filterMainQueue; 

और init में:

if (filterMainQueue == nil) { 
    filterMainQueue = dispatch_queue_create("com.myQueue.CJFilterMainQueue", NULL); 
} 

लेकिन एआरसी के बाद, मुझे यकीन है कि अगर यह अभी भी होना चाहिए "निर्दिष्ट" नहीं कर रहा हूँ, या यह "मजबूत होना चाहिए "या" कमजोर "। एआरसी कनवर्टर स्क्रिप्ट ने कुछ भी नहीं बदला लेकिन मुझे यकीन नहीं है कि क्या सूक्ष्म बग इस तथ्य से आ रहा है कि इस कतार का इस्तेमाल होने पर इसे हटाया जा सकता है?

3 प्रकार के गुणों के बीच क्या अंतर होगा, और एआरसी का उपयोग करते समय प्रेषण कतार के लिए सबसे अच्छा क्या होगा?

उत्तर

55

अपडेट किया गया जवाब:

वर्तमान ओएस एक्स और iOS में, डिस्पैच वस्तुओं अब एआरसी द्वारा Obj सी वस्तुओं के रूप में माना जाता है। वे स्मृति-प्रबंधित होंगे जैसे ओब्जे-सी ऑब्जेक्ट्स, और आपको अपनी संपत्ति के लिए strong का उपयोग करना चाहिए।

यह मैक्रो द्वारा नियंत्रित किया जाता है, जिसे <os/object.h> में परिभाषित किया गया है। यह डिफ़ॉल्ट रूप से 1 पर सेट होता है जब आपका परिनियोजन लक्ष्य ओएस एक्स 10.8 या उच्चतर, या आईओएस 6.0 या उच्चतम होता है। यदि आप पुराने ओएस पर तैनात हैं, तो यह 0 पर छोड़ा गया है और आपको नीचे अपना मूल उत्तर देखना चाहिए।


मूल जवाब:

डिस्पैच वस्तुओं (कतारों सहित) Obj सी वस्तुओं नहीं हैं, इसलिए ही संभव विकल्प assign है। यदि आप strong या weak का उपयोग करने का प्रयास करते हैं तो संकलक एक त्रुटि फेंक देगा। एआरसी का जीसीडी पर कोई असर नहीं है।

+0

@JimThio: [ग्रांड सेंट्रल डिस्पैच] (http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html) –

+13

यह अब माउंटेन शेर में सच है - देखें /usr/include/os/object.h। जीसीडी और एक्सपीसी "ऑब्जेक्ट्स" (जो भी आप स्पष्ट रूप से रिलीज कर सकते हैं) अब ओबीजेसी ऑब्जेक्ट्स की तरह व्यवहार करते हैं कि वे एआरसी में भाग ले सकते हैं। – jkh

+0

@jkh क्या आईओएस मंच भी शामिल है? – Ankur

4

यहाँ मैं क्या उपयोग है:

@property (readwrite, strong, nonatomic) __attribute__((NSObject)) dispatch_queue_t queue; 
+0

क्यों? क्या आप समझा सकते हैं? –

+2

यह मूल रूप से एक गैर-ओबीजेसी ऑब्जेक्ट को ओबीजेसी प्रॉपर्टी में बदल देता है ताकि आप आसानी से इसका उपयोग कर सकें। Self.queue – Arvin

+0

@ अरविन 6.1 के साथ कुछ बदल गया जिसने इसे प्रभावित किया। इसने __attribute__ के बारे में शिकायत की और इसे हटाने के लिए अब काम करना प्रतीत होता है। मैंने किसी भी मुद्दे में भाग नहीं लिया है, इसलिए मैं अनुमान लगा रहा हूं कि संपत्ति (रीडराइट, मजबूत, nonatomic) dispatch_queue_t कतार सुरक्षित है? – TheJer

4

iOS7 आधार पर, मैं परीक्षण किया है कि क्या dispatch_queue वस्तु एक उद्देश्य-सी वस्तु है और मैं पता लगा वे पहले से ही उद्देश्य-सी वस्तु है। इसे पैराफ्रेश करने के लिए, विशेषता ((NSObject)) अब आवश्यक नहीं है।

1

टीएल; डीआर: dispatch_queue_t अब एक उद्देश्य सी ऑब्जेक्ट है और इसे एआरसी के साथ प्रबंधित किया जा सकता है।

मैंने परीक्षण नहीं किया है कि यह कितना दूर है, लेकिन आईओएस 7 एसडीके और एक्सकोड 5, dispatch_queue_t का उपयोग एक ऑब्जेक्ट प्रकार है। मैं के रूप में

@property (nonatomic, strong) dispatch_queue_t syncQueue; 

संकलक खुश है और सब कुछ उम्मीद के रूप में काम करता है एक कतार के लिए एक संपत्ति घोषणा कर रहा हूँ। मुझे निश्चित रूप से पता है कि यह आईओएस 4 या 5 में काम नहीं करता था (प्री-एआरसी strong के बजाय retain था)।मैं dispatch_queue_t के लिए परिभाषा में खोदे गए और पाया इस:

/*! 
* @typedef dispatch_queue_t 
* 
* @abstract 
* Dispatch queues invoke blocks submitted to them serially in FIFO order. A 
* queue will only invoke one block at a time, but independent queues may each 
* invoke their blocks concurrently with respect to each other. 
* 
* @discussion 
* Dispatch queues are lightweight objects to which blocks may be submitted. 
* The system manages a pool of threads which process dispatch queues and 
* invoke blocks submitted to them. 
* 
* Conceptually a dispatch queue may have its own thread of execution, and 
* interaction between queues is highly asynchronous. 
* 
* Dispatch queues are reference counted via calls to dispatch_retain() and 
* dispatch_release(). Pending blocks submitted to a queue also hold a 
* reference to the queue until they have finished. Once all references to a 
* queue have been released, the queue will be deallocated by the system. 
*/ 
DISPATCH_DECL(dispatch_queue); 

कि की आवाज़ से, यह काम नहीं करना चाहिए, तो मैं DISPATCH_DECL की परिभाषा की जाँच की और जो इसकी व्याख्या इस पाया, सब कुछ:

/* 
* By default, dispatch objects are declared as Objective-C types when building 
* with an Objective-C compiler. This allows them to participate in ARC, in RR 
* management by the Blocks runtime and in leaks checking by the static 
* analyzer, and enables them to be added to Cocoa collections. 
* See <os/object.h> for details. 
*/ 
7

यहाँ कैसे एक आईओएस 6.0 के लिए और ऊपर और नीचे आईओएस 6,0

#if OS_OBJECT_HAVE_OBJC_SUPPORT == 1 
@property (nonatomic, strong) dispatch_queue_t serialDispatchQueue; 
#else 
@property (nonatomic, assign) dispatch_queue_t serialDispatchQueue; 
#endif 

मूल रूप से OS_OBJECT_HAVE_OBJC_SUPPORT मैं dispatch_queue_t संपत्ति को परिभाषित करेगा है आईओएस 6.0 और ऊपर के लिए 1 के रूप में परिभाषित किया गया है। (मैक 10.8 और ऊपर)। आईओएस 6 के नीचे इसे 0.

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

+1

यह किसी भी तरह कोकोपोड्स पुस्तकालयों में विफल रहता है http://stackoverflow.com/q/27267865/1049134 – Rivera

संबंधित मुद्दे

 संबंधित मुद्दे