ios - @property और उद्देश्य-सी में असाइन, असाइन, प्रतिलिपि, nonatomic बनाए रखें




objective-c iphone (3)

@property के गुणों के बारे में जानने से पहले, आपको पता होना चाहिए कि @property का उपयोग क्या है।

  • @property उस जानकारी को परिभाषित करने का एक तरीका प्रदान करता है जिसे कक्षा को समाहित करने का इरादा है। यदि आप @property का उपयोग करके ऑब्जेक्ट / वैरिएबल घोषित करते हैं, तो वह ऑब्जेक्ट / वेरिएबल अपनी कक्षा आयात करने वाले अन्य वर्गों तक पहुंच योग्य होगा।

  • यदि आप हेडर फ़ाइल में @property का उपयोग करके ऑब्जेक्ट घोषित करते हैं, तो आपको कार्यान्वयन फ़ाइल में @ सिंथेसाइज़ का उपयोग करके इसे संश्लेषित करना होगा। यह ऑब्जेक्ट केवीसी अनुपालन करता है । डिफ़ॉल्ट रूप से, कंपाइलर इस ऑब्जेक्ट के लिए एक्सेसर विधियों को संश्लेषित करेगा।

  • एक्सेसर विधियां हैं: सेटर और गेटर।

उदाहरण: एच

@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end

.m

@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 के गुणों की सूची

    परमाणु, nonatomic, बनाए रखने, प्रतिलिपि, readonly, readwrite, असाइन, मजबूत, गेटर = विधि, setter = विधि, unsafe_unretained

  • परमाणु डिफ़ॉल्ट व्यवहार है। यदि किसी ऑब्जेक्ट को परमाणु के रूप में घोषित किया जाता है तो यह थ्रेड-सुरक्षित हो जाता है। थ्रेड-सुरक्षित का मतलब है, उस समय उस वर्ग के किसी विशेष उदाहरण के केवल एक थ्रेड पर उस ऑब्जेक्ट पर नियंत्रण हो सकता है।

अगर थ्रेड गेटर विधि कर रहा है तो अन्य थ्रेड उस ऑब्जेक्ट पर सेटर विधि नहीं कर सकता है। यह धीमा है।

@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
  • nonatomic थ्रेड-सुरक्षित नहीं है। आप nonatomic प्रॉपर्टी एट्रिब्यूट का उपयोग यह निर्दिष्ट करने के लिए कर सकते हैं कि संश्लेषित एक्सेसर्स बस सेट को सीधे सेट या वापस लौटाते हैं, इसके बारे में कोई गारंटी नहीं है कि क्या होता है यदि उसी मान को अलग-अलग धागे से एक साथ एक्सेस किया जाता है।

इस कारण से, एक परमाणु से एक nonatomic संपत्ति का उपयोग करना तेजी से है।

@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; 
  • गेटर = विधि यदि आप गेटटर विधि के लिए एक अलग नाम का उपयोग करना चाहते हैं, तो संपत्ति में विशेषताओं को जोड़कर कस्टम नाम निर्दिष्ट करना संभव है।

बूलियन गुणों के मामले में (जिन गुणों में हाँ या कोई मान नहीं है), यह "है" शब्द से शुरू करने के लिए गेटर विधि के लिए प्रथागत है

@property (getter=isFinished) BOOL finished;
  • setter = method यदि आप एक सेटर विधि के लिए एक अलग नाम का उपयोग करना चाहते हैं, तो संपत्ति में विशेषताओं को जोड़कर एक कस्टम नाम निर्दिष्ट करना संभव है।

विधि को एक कोलन के साथ समाप्त होना चाहिए।

@property(setter = boolBool:) BOOL finished;
  • unsafe_unretained कोको और कोको टच में कुछ कक्षाएं हैं जो अभी तक कमजोर संदर्भों का समर्थन नहीं करती हैं, जिसका अर्थ है कि आप उन्हें कम रखने के लिए एक कमजोर संपत्ति या कमजोर स्थानीय चर घोषित नहीं कर सकते हैं। इन कक्षाओं में एनएसटीक्स्टव्यू, एनएसएफओटी और एनएससीओलर स्पेस, आदि शामिल हैं। यदि आपको इन कक्षाओं में से किसी एक के लिए कमजोर संदर्भ का उपयोग करने की आवश्यकता है, तो आपको एक असुरक्षित संदर्भ का उपयोग करना होगा।

एक असुरक्षित संदर्भ एक कमजोर संदर्भ के समान है जिसमें यह संबंधित वस्तु को जीवित नहीं रखता है, लेकिन गंतव्य ऑब्जेक्ट को अस्वीकार कर दिया गया है, लेकिन यह शून्य पर सेट नहीं किया जाएगा।

@property (unsafe_unretained) NSObject *unsafeProperty;

यदि आपको एकाधिक विशेषताओं को निर्दिष्ट करने की आवश्यकता है, तो बस उन्हें अल्पविराम से अलग सूची के रूप में शामिल करें, जैसे:

@property (readonly, getter=isFinished) BOOL finished;

किसी ऐसे व्यक्ति के रूप में जो उद्देश्य-सी के लिए नया है, क्या कोई मुझे बरकरार रखने, असाइन करने, प्रतिलिपि बनाने और किसी अन्य व्यक्ति का अवलोकन कर सकता है, जो @property निर्देश का पालन करता है? वे क्या कर रहे हैं और मैं एक दूसरे का उपयोग क्यों करना चाहूंगा?


परमाणु संपत्ति को एक समय में केवल एक धागे द्वारा पहुंचा जा सकता है। यह धागा सुरक्षित है । डिफ़ॉल्ट परमाणु है। कृपया ध्यान दें कि कोई कीवर्ड परमाणु नहीं है

Nonatomic का मतलब है कि एकाधिक थ्रेड आइटम तक पहुंच सकते हैं। यह थ्रेड असुरक्षित है

इसलिए परमाणु का उपयोग करते समय बहुत सावधान रहना चाहिए। इससे आपके कोड के प्रदर्शन को प्रभावित होता है


कई लेख पढ़ने के बाद मैंने सभी विशेषताओं की जानकारी एक साथ रखने का फैसला किया:

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

नीचे विस्तृत लेख का एक लिंक है जहां आप इन विशेषताओं को पा सकते हैं।

उन सभी लोगों के लिए बहुत धन्यवाद जो यहां सबसे अच्छे उत्तर देते हैं !!

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

आलेख से नमूना विवरण यहां दिया गया है

  1. परमाणु- एटॉमिक का अर्थ केवल एक धागा चर (स्थिर प्रकार) तक पहुंचता है। -एटॉमिक धागा सुरक्षित है। लेकिन यह प्रदर्शन में धीमा है -टॉमिक डिफ़ॉल्ट व्यवहार है- एक गैर कचरा एकत्रित वातावरण (यानी जब रखरखाव / रिलीज / ऑटोरेलीज का उपयोग करते समय) में आटोमिक एक्सेसर्स यह सुनिश्चित करने के लिए लॉक का उपयोग करेंगे कि कोई अन्य थ्रेड सही सेटिंग / हो रही में हस्तक्षेप नहीं करता है मूल्य का यह वास्तव में एक कीवर्ड नहीं है।

उदाहरण :

@property (retain) NSString *name;

@synthesize name;
  1. nonatomic- Nonatomic का अर्थ है एकाधिक धागे चर (गतिशील प्रकार) का उपयोग करें। -नोनैटोमिक थ्रेड असुरक्षित है। - लेकिन यह प्रदर्शन में तेज़ है- नोनाटॉमिक डिफ़ॉल्ट व्यवहार नहीं है, हमें संपत्ति विशेषता में nonatomic कीवर्ड जोड़ने की आवश्यकता है। - इसके परिणामस्वरूप अप्रत्याशित व्यवहार हो सकता है, जब दो अलग-अलग प्रक्रिया (धागे) एक ही समय में एक ही चर का उपयोग करते हैं।

उदाहरण:

@property (nonatomic, retain) NSString *name;

@synthesize name;

के बारे में बताएं:

मान लीजिए कि "नाम" नामक एक परमाणु स्ट्रिंग प्रॉपर्टी है, और यदि आप थ्रेड ए से [self setName: @ "A"] को कॉल करते हैं, तो थ्रेड बी से [self setName: @ "B"] पर कॉल करें, और [self name] से कॉल करें थ्रेड सी, तो विभिन्न धागे पर सभी ऑपरेशन क्रमशः किया जाएगा जिसका अर्थ है कि अगर एक धागा सेटटर या गेटर निष्पादित कर रहा है, तो अन्य धागे इंतजार करेंगे। यह संपत्ति "नाम" को सुरक्षित / लिखने में सुरक्षित बनाता है, लेकिन यदि एक और धागा डी कॉल [नाम रिलीज] एक साथ होता है तो यह ऑपरेशन एक क्रैश उत्पन्न कर सकता है क्योंकि यहां कोई सेटटर / गेटर कॉल शामिल नहीं है। जिसका अर्थ है कि ऑब्जेक्ट को सुरक्षित / लिखना सुरक्षित है (एटीओएमआईसी) लेकिन थ्रेड सुरक्षित नहीं है क्योंकि एक और धागे ऑब्जेक्ट को किसी भी प्रकार के संदेश भेज सकते हैं। डेवलपर को ऐसी वस्तुओं के लिए थ्रेड सुरक्षा सुनिश्चित करनी चाहिए।

यदि संपत्ति "नाम" nonatomic था, तो उपरोक्त उदाहरण में सभी धागे - ए, बी, सी और डी एक साथ अप्रत्याशित परिणाम उत्पादन एक साथ निष्पादित करेगा। परमाणु के मामले में, ए, बी या सी में से कोई भी पहले निष्पादित करेगा लेकिन डी अभी भी समानांतर में निष्पादित हो सकता है।

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

उदाहरण:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;
  1. कमजोर (आईओएस 4 = unsafe_unretained) - यह कहता है "जब तक कोई और इसे दृढ़ता से इंगित करता है तब तक इसे रखें" - एक ही चीज़ असाइन करें, कोई रखरखाव या रिलीज नहीं - एक "कमजोर" संदर्भ एक संदर्भ है जिसे आप बनाए नहीं रखते हैं। -हम आम तौर पर आईबीओटलेट्स (यूआईवीव कंट्रोलर चाइल्ड्स) के लिए कमजोर का उपयोग करते हैं। यह काम करता है क्योंकि बच्चे ऑब्जेक्ट को केवल तब तक मौजूद होना चाहिए जब तक कि मूल वस्तु न हो। - एक कमजोर संदर्भ एक संदर्भ है जो संदर्भित ऑब्जेक्ट को कचरा कलेक्टर द्वारा संग्रह से सुरक्षित नहीं करता है। -वेक अनिवार्य रूप से असाइन किया गया है, एक अप्रत्याशित संपत्ति। जब वस्तु को हटा दिया जाता है, तब भी कमजोर पॉइंटर स्वचालित रूप से शून्य पर सेट हो जाता है

उदाहरण :

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

@synthesize myButton;

मजबूत और कमजोर स्पष्टीकरण, बीजे होमर के लिए धन्यवाद :

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

  1. बनाए रखें = मजबूत -ट बनाए रखा गया है, पुराना मान जारी किया गया है और इसे असाइन किया गया है - बताएं कि नया मान भेजा जाना चाहिए- असाइनमेंट पर रखें और पुराना मूल्य भेजा गया - कृपया- मजबूत मजबूत के समान ही है। -पल कहते हैं कि यदि आप बनाए रखना लिखते हैं तो यह स्वचालित रूप से मजबूत / काम की तरह काम करेगा। "एलोक" जैसे तरीकों में एक अंतर्निहित "बनाए रखना" शामिल है

उदाहरण:

@property (nonatomic, retain) NSString *name;

@synthesize name;
  1. असाइन-असाइन डिफ़ॉल्ट है और बस एक वैरिएबल असाइनमेंट करता है -साइन एक प्रॉपर्टी एट्रिब्यूट है जो संकलक को संपत्ति के सेटटर कार्यान्वयन को संश्लेषित करने के लिए कहता है- मैं सी आदिम गुणों के लिए असाइनमेंट का उपयोग करता हूं और उद्देश्य-सी ऑब्जेक्ट्स के कमजोर संदर्भों के लिए कमजोर होता।

उदाहरण:

@property (nonatomic, assign) NSString *address;

@synthesize address;
  1. unsafe_unretained

    -unsafe_unretained एक स्वामित्व क्वालीफायर है जो एआरसी को बताता है कि कॉल को बनाए रखने / रिलीज़ करने के लिए कैसे -unsa_unretained असाइन का एआरसी संस्करण है।

उदाहरण:

@property (nonatomic, unsafe_unretained) NSString *nickName;

@synthesize nickName;
  1. ऑब्जेक्ट म्यूटेबल होने पर कॉपी-कॉपी आवश्यक है। -कोपी निर्दिष्ट करता है कि नया मान भेजा जाना चाहिए-असाइनमेंट पर कॉपी और पुराना मान भेजा गया - कृपया। -कोपी गैर-कचरा एकत्रित वातावरण में स्पष्ट रूप से रिलीज (उदाहरण के लिए, डेलोक में) एक वस्तु को रिटर्न प्राप्त करने की तरह है। - अगर आप प्रतिलिपि का उपयोग करते हैं तो आपको अभी भी इसे डेलोक में रिलीज़ करने की आवश्यकता है। - अगर आपको इस पल में ऑब्जेक्ट के मान की आवश्यकता है, तो इसका उपयोग करें, और आप नहीं चाहते कि वह ऑब्जेक्ट के अन्य मालिकों द्वारा किए गए किसी भी बदलाव को प्रतिबिंबित करे। जब आप इसके साथ समाप्त हो जाते हैं तो आपको ऑब्जेक्ट को रिलीज़ करने की आवश्यकता होगी क्योंकि आप प्रतिलिपि बना रहे हैं।

उदाहरण:

@property (nonatomic, copy) NSArray *myArray;

@synthesize myArray;




memory-management