जैसा कि कोई व्यक्ति जो उद्देश्य-सी के लिए नया है, क्या कोई मुझे रिटेन, असाइन, कॉपी और किसी अन्य व्यक्ति का अवलोकन दे सकता है, जो @property निर्देश का पालन करता है? वे क्या कर रहे हैं और मैं एक दूसरे पर क्यों इस्तेमाल करना चाहूंगा?
जैसा कि कोई व्यक्ति जो उद्देश्य-सी के लिए नया है, क्या कोई मुझे रिटेन, असाइन, कॉपी और किसी अन्य व्यक्ति का अवलोकन दे सकता है, जो @property निर्देश का पालन करता है? वे क्या कर रहे हैं और मैं एक दूसरे पर क्यों इस्तेमाल करना चाहूंगा?
जवाबों:
MrMage द्वारा लिंक किया गया लेख अब काम नहीं कर रहा है। इसलिए, मैंने अपने (बहुत) कम समय के उद्देश्य-सी में कोडिंग सीखी है:
गैर-परमाणु बनाम परमाणु - "परमाणु" डिफ़ॉल्ट है। हमेशा "गैर-परमाणु" का उपयोग करें। मुझे नहीं पता कि क्यों, लेकिन मैंने जो किताब पढ़ी है उसमें कहा गया है कि "परमाणु" का उपयोग करने के लिए "शायद ही कभी एक कारण" है। (बीटीडब्ल्यू: मैंने जो किताब पढ़ी है वह बीएनआर "आईओएस प्रोग्रामिंग" पुस्तक है।)
readwrite बनाम readonly - "readwrite" डिफ़ॉल्ट है। जब आप @synthesize करते हैं, तो आपके लिए एक गेटटर और सेटर दोनों बनाए जाएंगे। यदि आप "आसानी से" का उपयोग करते हैं, तो कोई सेटर नहीं बनाया जाएगा। उस मूल्य के लिए इसका उपयोग करें जिसे आप ऑब्जेक्ट की तात्कालिकता के बाद कभी बदलना नहीं चाहते हैं।
बनाए रखने बनाम प्रतिलिपि असाइन करें
atomic
उतना ही बुरा है जितना कि सलाह देना nonatomic
। न तो विकल्प "सही" है, इसलिए भाषा डिजाइनरों ने दो समाधानों के सुरक्षित होने का विकल्प चुना। वास्तव nonatomic
में आम तौर पर बेहतर विकल्प है क्योंकि यह बहुत महंगा धागा ताले को छोड़ देता है। उपयोग करने का एकमात्र कारण यह atomic
है कि यदि आपकी संपत्ति कई थ्रेड्स से सेट की जा सकती है (जिस स्थिति में इसे छोड़ने पर ओवर-रिलीज़ या रिसाव हो सकता है)।
इससे पहले कि आप @property की विशेषताओं के बारे में जानें, आपको पता होना चाहिए कि @property का उपयोग क्या है।
@property उन सूचनाओं को परिभाषित करने का एक तरीका प्रदान करता है जो एक वर्ग का उद्देश्य होता है। यदि आप @property का उपयोग करके किसी ऑब्जेक्ट / वेरिएबल की घोषणा करते हैं , तो वह ऑब्जेक्ट / वैरिएबल उसके क्लास को इम्पोर्ट करने वाले अन्य वर्गों के लिए सुलभ होगा।
यदि आप हेडर फ़ाइल में @property का उपयोग करके किसी ऑब्जेक्ट को घोषित करते हैं , तो आपको कार्यान्वयन फ़ाइल में @synthesize का उपयोग करके इसे संश्लेषित करना होगा । यह वस्तु को केवीसी के अनुरूप बनाता है । डिफ़ॉल्ट रूप से, कंपाइलर इस ऑब्जेक्ट के लिए एक्सेसर विधियों को संश्लेषित करेगा ।
एक्सेसर विधियाँ हैं: सेटर और गेट्टर।
उदाहरण:
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
।म
@implementation XYZClass
@synthesize name;
@end
अब कंपाइलर नाम के लिए एक्सेसर विधि को संश्लेषित करेगा ।
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
@Property की विशेषताओं की सूची
परमाणु, गैर-परमाणु, बरकरार, प्रतिलिपि, आसानी से, पढ़े-लिखे, असाइन, मजबूत, पाने वाला = विधि, सेटर = विधि, असुरक्षित_सुना
परमाणु डिफ़ॉल्ट व्यवहार है। यदि किसी वस्तु को परमाणु घोषित किया जाता है तो वह थ्रेड-सेफ़ हो जाती है। थ्रेड-सुरक्षित साधन, उस समय उस वर्ग के किसी विशेष उदाहरण के केवल एक थ्रेड पर उस ऑब्जेक्ट पर नियंत्रण हो सकता है।
यदि थ्रेड गेट्टर विधि कर रहा है, तो अन्य थ्रेड उस ऑब्जेक्ट पर सेटर विधि निष्पादित नहीं कर सकता है। यह धीमा है।
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
इस कारण से, परमाणु की तुलना में गैर-परमाणु संपत्ति तक पहुंचना तेज़ है।
@property (nonatomic)NSString *name;
सेटर विधि ऑब्जेक्ट की बनाए रखने की संख्या को बढ़ाएगी, जिससे यह ऑटोरेलिज पूल में मेमोरी पर कब्जा कर लेगा।
@property (retain)NSString *name;
भले ही एक उत्परिवर्ती स्ट्रिंग सेट हो और बाद में बदल जाए, उदाहरण उस समय जो भी मूल्य निर्धारित किया गया है, उसे कैप्चर करता है। कोई सेटर और गेट्टर विधियों को संश्लेषित नहीं किया जाएगा।
@property (copy) NSString *name;
अभी,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
नाम अप्रभावित रहेगा।
कंपाइलर एक गेटर उत्पन्न करेगा, लेकिन एक सेटर नहीं।
@property (readonly) NSString *name;
यह पठनीयता के विपरीत है।
@property (readwrite) NSString *name;
ध्यान रखें कि कचरा संग्रहण सक्षम होने पर मूल रूप से विनिमेय होने और असाइन होने योग्य है।
@property (assign) NSInteger year;
यह एआरसी के साथ आता है।
@property (nonatomic, strong) AVPlayer *player;
बूलियन गुणों के मामले में (ऐसे गुण जिनके पास YES या NO मान है), यह गेटर विधि के लिए प्रथागत है "शब्द"
@property (getter=isFinished) BOOL finished;
विधि एक बृहदान्त्र के साथ समाप्त होनी चाहिए।
@property(setter = boolBool:) BOOL finished;
एक असुरक्षित संदर्भ एक कमजोर संदर्भ के समान है, जिसमें वह अपनी संबंधित वस्तु को जीवित नहीं रखता है, लेकिन गंतव्य ऑब्जेक्ट के हटने पर इसे शून्य पर सेट नहीं किया जाएगा ।
@property (unsafe_unretained) NSObject *unsafeProperty;
यदि आपको कई विशेषताओं को निर्दिष्ट करने की आवश्यकता है, तो उन्हें इस तरह से अल्पविराम से अलग की गई सूची में शामिल करें:
@property (readonly, getter=isFinished) BOOL finished;
@property
हेडर फाइल में है, तो आप के लिए है इसे प्रयोग के संश्लेषण के @synthesize
कार्यान्वयन फ़ाइल में।" हर बार नहीं। उदाहरण के लिए, "डिफ़ॉल्ट रूप से, एक readwrite
संपत्ति एक उदाहरण चर द्वारा समर्थित होगी, जिसे फिर से संकलक द्वारा स्वचालित रूप से संश्लेषित किया जाएगा।" से दस्तावेज़ ।
कई लेख पढ़ने के बाद मैंने सभी विशेषताओं की जानकारी एक साथ रखने का फैसला किया:
- परमाणु // डिफ़ॉल्ट
- nonatomic
- मजबूत = बनाए रखने / डिफ़ॉल्ट
- कमजोर = असुरक्षित_सुना
- बनाए रखने के
- // डिफ़ॉल्ट असाइन करें
- unsafe_unretained
- प्रतिलिपि
- सिफ़ पढ़िये
- readwrite // डिफ़ॉल्ट
नीचे विस्तृत लेख का लिंक दिया गया है जहाँ आप इन विशेषताओं को पा सकते हैं।
उन सभी लोगों को बहुत धन्यवाद, जो यहाँ सबसे अच्छा जवाब देते हैं !!
यहाँ अनुच्छेद से नमूना विवरण है
उदाहरण :
@property (retain) NSString *name;
@synthesize name;
उदाहरण:
@property (nonatomic, retain) NSString *name;
@synthesize name;
के बारे में बताएं:
मान लीजिए कि "नाम" नामक एक परमाणु स्ट्रिंग संपत्ति है, और यदि आप थ्रेड ए से [सेल्फ सेटनाम: @ "ए"] को कॉल करते हैं, तो थ्रेड बी से [सेल्फ सेटनाम: @ "बी"] कॉल करें, और [सेल्फ नेम] को कॉल करें। थ्रेड सी, फिर विभिन्न थ्रेड पर सभी ऑपरेशन क्रमबद्ध रूप से किए जाएंगे जिसका अर्थ है कि यदि एक थ्रेड सेटर या गेट्टर को निष्पादित कर रहा है, तो अन्य थ्रेड्स इंतजार करेंगे। यह संपत्ति को "नाम" पढ़ने / लिखने के लिए सुरक्षित बनाता है लेकिन अगर एक और थ्रेड डी [नाम रिलीज] को एक साथ कॉल करता है तो यह ऑपरेशन एक दुर्घटना उत्पन्न कर सकता है क्योंकि यहां कोई सेटर / गेट्टर कॉल शामिल नहीं है। जिसका अर्थ है कि कोई वस्तु सुरक्षित / लिखित (ATOMIC) लिखी जाती है, लेकिन थ्रेड सुरक्षित नहीं है क्योंकि अन्य धागे एक साथ किसी भी प्रकार के संदेश को वस्तु में भेज सकते हैं। डेवलपर को ऐसी वस्तुओं के लिए थ्रेड सुरक्षा सुनिश्चित करनी चाहिए।
यदि संपत्ति "नाम" गैर-परमाणु थी, तो उपरोक्त सभी उदाहरण - ए, बी, सी और डी किसी भी अप्रत्याशित परिणाम का उत्पादन करने के साथ-साथ निष्पादित करेंगे। परमाणु के मामले में, ए, बी या सी में से कोई एक पहले निष्पादित करेगा लेकिन डी अभी भी समानांतर में निष्पादित कर सकता है।
उदाहरण:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
उदाहरण :
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
मजबूत और कमजोर व्याख्या, बीजे होमर को धन्यवाद :
कल्पना कीजिए कि हमारी वस्तु एक कुत्ता है, और यह कि कुत्ता भागना चाहता है (निस्संकोच)। मजबूत संकेत कुत्ते पर पट्टा की तरह हैं। जब तक आपके पास कुत्ते से जुड़ा पट्टा है, तब तक कुत्ता भाग नहीं जाएगा। यदि पाँच लोग अपने पट्टे को एक कुत्ते को देते हैं, (पाँच मजबूत संकेत एक वस्तु को), तो कुत्ता तब तक नहीं भागेगा जब तक कि सभी पाँच पट्टे अलग न हो जाएँ। दूसरी ओर कमजोर बिंदु, छोटे बच्चों की तरह हैं जो कुत्ते की ओर इशारा करते हैं और कहते हैं कि "देखो! कुत्ता!" जब तक कुत्ता अभी भी पट्टा पर है, छोटे बच्चे अभी भी कुत्ते को देख सकते हैं, और वे अभी भी इसे इंगित करेंगे। जैसे ही सभी पट्टा अलग हो जाते हैं, हालांकि, कुत्ते को कोई फर्क नहीं पड़ता कि कितने छोटे बच्चे इसे इंगित कर रहे हैं। जैसे ही अंतिम मजबूत सूचक (पट्टा) किसी वस्तु की ओर इशारा नहीं करता है, वस्तु को हटा दिया जाएगा, और सभी कमजोर बिंदुओं को शून्य कर दिया जाएगा। जब हम कमजोर का उपयोग करते हैं? केवल उसी समय जब आप कमजोर का उपयोग करना चाहते हैं, यदि आप चक्र को बनाए रखने से बचना चाहते हैं (जैसे माता-पिता बच्चे को बनाए रखते हैं और बच्चा माता-पिता को बनाए रखता है तो न तो कभी जारी किया जाता है)।
उदाहरण:
@property (nonatomic, retain) NSString *name;
@synthesize name;
उदाहरण:
@property (nonatomic, assign) NSString *address;
@synthesize address;
unsafe_unretained
-unsafe_unretain ARC बताता है कि ARC बताता है कि कैसे अनुरक्षण / रिलीज़ कॉल सम्मिलित करें / -sun_tainre ARC असाइनमेंट का संस्करण है।
उदाहरण:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
उदाहरण:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
परमाणु संपत्ति को एक समय में केवल एक धागे से एक्सेस किया जा सकता है। यह धागा सुरक्षित है । डिफ़ॉल्ट परमाणु है। कृपया ध्यान दें कि कोई कीवर्ड परमाणु नहीं है
गैर-परमाणु का अर्थ है कि कई थ्रेड आइटम तक पहुँच सकते हैं। यह थ्रेड असुरक्षित है
इसलिए परमाणु का उपयोग करते समय किसी को बहुत सावधान रहना चाहिए। क्या यह आपके कोड के प्रदर्शन को प्रभावित करता है
iOS में ऑब्जेक्टिव-सी के गुणों के बारे में इस लिंक को पसंद करें ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html