उद्देश्य-सी में कमजोर और मजबूत संपत्ति सेटर गुण


94

उद्देश्य-सी में कमजोर और मजबूत संपत्ति सेटर विशेषताओं के बीच अंतर क्या है?

@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;

प्रभाव और लाभ क्या है?

मैंने सुना है कि आईओएस 4 पर कमजोर उपलब्ध नहीं है और हमें असाइन का उपयोग करने की आवश्यकता है।

क्या कमज़ोर होना समान है?


जवाबों:


102

आपके पास किसी विशेष फ़ाइल के लिए या तो ARC है या बंद है। यदि आप पर इसका उपयोग नहीं कर सकते हैं retain release autorelease... इसके बजाय आप strong weakगुणों के लिए या __strong __weak चर के लिए उपयोग (चूक __strong)। मजबूत बनाए रखने के लिए बराबर है, हालांकि एआरसी आपके लिए रिलीज का प्रबंधन करेगा।

केवल उसी समय जब आप कमजोर का उपयोग करना चाहते हैं, यदि आप चक्र को बनाए रखने से बचना चाहते हैं (जैसे माता-पिता बच्चे को बनाए रखते हैं और बच्चा माता-पिता को बनाए रखता है, तो न तो कभी जारी होता है)।

'टोल फ्री ब्रिजिंग' भाग (से कास्टिंग NSकरना CF) थोड़ा मुश्किल है। आपको अभी भी मैन्युअल रूप से CFRelease()और CFRetain()CF वस्तुओं के लिए प्रबंधन करना होगा । जब आप उन्हें NS ऑब्जेक्ट्स में परिवर्तित करते हैं तो आपको कंपाइलर को रिटेन काउंट के बारे में बताना होगा ताकि यह पता चले कि आपने क्या किया है।

यह सब यहाँ है


119

यहाँ वह जानकारी है जो मुझे चर गुणों के बारे में पता है

  1. परमाणु // डिफ़ॉल्ट
  2. nonatomic
  3. मजबूत = बनाए रखने के लिए // डिफ़ॉल्ट
  4. कमज़ोर
  5. बनाए रखने के
  6. // डिफ़ॉल्ट असाइन करें
  7. unsafe_unretained
  8. प्रतिलिपि
  9. सिफ़ पढ़िये
  10. readwrite // डिफ़ॉल्ट

इसलिए नीचे विस्तृत लेख लिंक दिया गया है जहाँ आप उपर्युक्त सभी विशेषताओं को पा सकते हैं, जो आपकी सहायता करेगा। यहाँ पर सबसे अच्छा जवाब देने वाले सभी लोगों को बहुत धन्यवाद !!

आईओएस में परिवर्तनीय संपत्ति विशेषताएँ या संशोधक

01. मजबूत (iOS4 = रिटेन) - यह कहता है "इसे ढेर में रखें जब तक कि मैं इसे अब और इंगित नहीं करता" - दूसरे शब्दों में "मैं स्वामी हूं, आप इसे बनाए रखने से पहले ठीक से निशाना लगाने से पहले इसे निपटा नहीं सकते।" "- आप मजबूत का उपयोग केवल तभी करते हैं जब आपको ऑब्जेक्ट को बनाए रखने की आवश्यकता होती है। - डिफ़ॉल्ट रूप से सभी उदाहरण चर और स्थानीय चर मजबूत संकेत हैं। - हम आम तौर पर UIViewControllers (UI आइटम के माता-पिता) के लिए मजबूत का उपयोग करते हैं - ARC के साथ मजबूत का उपयोग किया जाता है और यह मूल रूप से आपकी मदद करता है, किसी ऑब्जेक्ट की रिटेन काउंट के बारे में चिंता न करने से। एआरसी स्वचालित रूप से आपके लिए इसे जारी कर देता है जब आप इसके साथ होते हैं। कीवर्ड को मजबूत करने का अर्थ है कि आप ऑब्जेक्ट के मालिक हैं।

उदाहरण:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

02. कमज़ोर (iOS4 = unsafe_unretain) - यह कहता है "इसे तब तक रखें जब तक कोई व्यक्ति इसे दृढ़ता से इंगित करता है" - असाइन की गई कोई भी चीज़, कोई रिटेन या रिलीज़ नहीं - एक "कमजोर" संदर्भ एक संदर्भ है जिसे आप बनाए नहीं रखते हैं। - हम आम तौर पर IBOutlets (UIViewController's Childs) के लिए कमजोर का उपयोग करते हैं। यह काम करता है क्योंकि बच्चे की वस्तु को केवल तब तक मौजूद रहने की आवश्यकता होती है जब तक कि माता-पिता ऑब्जेक्ट करते हैं। - एक कमजोर संदर्भ एक संदर्भ है जो एक संग्रहकर्ता द्वारा संग्रह से संदर्भित ऑब्जेक्ट की रक्षा नहीं करता है। - कमजोर अनिवार्य रूप से, एक अप्राप्य संपत्ति है। सिवाय जब ऑब्जेक्ट को हटा दिया जाए तो कमजोर सूचक स्वचालित रूप से शून्य पर सेट हो जाता है

उदाहरण :

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

समझाएं : बीजे होमर को धन्यवाद

कल्पना कीजिए कि हमारी वस्तु एक कुत्ता है, और यह कि कुत्ता भागना चाहता है (निस्संकोच)। मजबूत संकेत कुत्ते पर पट्टा की तरह हैं। जब तक आपके पास कुत्ते से जुड़ा पट्टा है, तब तक कुत्ता भाग नहीं जाएगा। यदि पाँच लोग अपने पट्टे को एक कुत्ते को देते हैं, (पाँच मजबूत बिंदु एक वस्तु को), तो कुत्ता तब तक नहीं भागेगा जब तक कि सभी पाँच पट्टे अलग न हो जाएँ। दूसरी ओर कमजोर संकेत, छोटे बच्चों की तरह हैं जो कुत्ते की ओर इशारा करते हुए कहते हैं कि "देखो! कुत्ता!" जब तक कुत्ता पट्टा पर है, तब तक छोटे बच्चे अभी भी कुत्ते को देख सकते हैं, और वे अभी भी इसे इंगित करेंगे। जैसे ही सभी पट्टा अलग हो जाते हैं, हालांकि, कुत्ते को कोई फर्क नहीं पड़ता कि कितने छोटे बच्चे इसे इंगित कर रहे हैं। जैसे ही अंतिम मजबूत सूचक (पट्टा) किसी वस्तु को इंगित नहीं करता है, वस्तु को हटा दिया जाएगा, और सभी कमजोर बिंदुओं को शून्य कर दिया जाएगा। जब हम कमजोर का उपयोग करते हैं? केवल उसी समय जब आप कमजोर का उपयोग करना चाहते हैं, यदि आप चक्र को बनाए रखने से बचना चाहते हैं (जैसे माता-पिता बच्चे को बनाए रखते हैं और बच्चा माता-पिता को बनाए रखता है, तो न तो कभी जारी होता है)।


1
प्रारंभिक सूची में, मुझे वास्तव में यकीन नहीं है कि आप "डिफ़ॉल्ट" से क्या मतलब है। आपके पास दोनों हैं strong=retainऔर assignचूक के रूप में लेबल किया गया है, लेकिन यह दोनों नहीं हो सकता है।
स्लिप डी। थॉम्पसन

27
पट्टा तुलना पर कुत्ते का आनंद लिया। यह बहुत अच्छी तरह से बताते हैं।
जेरेट बार्नेट

1
अच्छी व्याख्या, हालांकि iOS कचरा संग्रहण का उपयोग नहीं करता है। एआरसी! = कचरा संग्रह (!), ये विभिन्न प्रौद्योगिकियां हैं।

1
कमजोर और असुरक्षित_अनुभवी अलग हैं (पहला शून्य के कमजोर संदर्भों का उपयोग करता है, जबकि बाद वाला स्क्वाट करता है)
wcochran

1
मैं केवल iOS सीख रहा हूँ, लेकिन यह है कि आप इधर उधर हो गई लगती है weakऔर strongअपने उदाहरण में। क्या यह अधिक समझ में नहीं आता है कि एक माता-पिता के पास strongअपने बच्चों के संदर्भ होते हैं ( वर्ग की myButtonसंपत्ति के रूप में UIViewControllerजो आपने दिखाया है weak) और यह कि बच्चे weakअपने माता-पिता के संदर्भ में रहते हैं (जैसे कि viewControllerबच्चे की कक्षा की संपत्ति जो आप ' इसके बजाय वी strong) को सेट किया गया । उदाहरण के लिए, मैट न्युबर्ग के पढ़ने से iOS 7 Programming Fundamentalsपता चलता है कि एक प्रतिनिधि को संपत्ति के रूप में घोषित करने वाला एक वर्ग इसे `कमजोर 'रखेगा, जो उचित लगता है।
बोगदान अलेक्जेंड्रू

2

रॉबर्ट द्वारा संदर्भित डॉक्स के कुछ हिस्सों को कॉल करने के लिए जो आपके अंतिम दो प्रश्नों का स्पष्ट रूप से उत्तर देते हैं:

// The following declaration is similar to "@property(assign) MyClass *myObject;"
// except that if the MyClass instance is deallocated,
// the property value is set to nil instead of remaining as a dangling pointer.
@property(weak) MyClass *myObject;

इसे शून्यिंग कमजोर संदर्भ के रूप में जाना जाता है। आप कमजोर संदर्भ बना सकते हैं जो __unsafe_unretain का उपयोग करके कमजोर संदर्भों को शून्य नहीं कर रहे हैं, लेकिन जैसा कि नाम से पता चलता है, यह आमतौर पर अनुशंसित नहीं है।

डॉक्स में भी:

Weak references are not supported in Mac OS X v10.6 and iOS 4.

1
हाँ यह सही है, __unsafe_unretainedका ARC संस्करण है assign
रॉबर्ट

2

WEAK संपत्ति का क्रिस्टल स्पष्ट उपयोग निम्नानुसार है:

Any control whose properties we need to change(eg:text of a label) is declared weak and as below:

@property(nonatomic,weak) IBOutlet Type *name;
Eg: @property(nonatomic,weak) IBOutlet UILabel *myLabel;

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

0

अधिक विस्तार करने के लिए एक उदाहरण दें (ऊपर उत्तर पहले से ही महान हैं), यह उदाहरण थोड़ा और मदद करता है

हम दो वर्ग ए और बी है

//A.h

#import <Foundation/Foundation.h>
#import "B.h"

@interface A : NSObject

@property (nonatomic, strong) B *objB;

@end

@implementation A
//

@end

//B.h

    #import <Foundation/Foundation.h>
    #import "A.h"


    @interface B : NSObject

    @property strong text(nonatomic, strong) A *objA;

    @end

    @implementation B
    //

    @end

    and in main

    #import "B.h"
    #import "A.h"

    {
    A *obja =[[A alloc]init];
    B *objb =[[B alloc]init];
    A.objB=objb;
    B.objA=obja;
   }

उपरोक्त कोड एक चक्र बनाए रखेगा क्योंकि दोनों एक मजबूत प्रकार हैं --------> b ---------> a

इसलिए इससे बचने के लिए आपको इसकी किसी एक सप्ताह की संपत्ति का उपयोग करना होगा ताकि यह साप्ताहिक रूप से ऑब्जेक्ट को संदर्भित करे और इसे संदर्भ संख्या में न बढ़ाए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.