Objective-C Language
गुण
खोज…
वाक्य - विन्यास
- @property (altern_attributes , ... ) प्रकार पहचानकर्ता ;
- @synthesize पहचानकर्ता = optional_backing_ivar;
- @ डायनामिक पहचानकर्ता ;
पैरामीटर
गुण | विवरण |
---|---|
atomic | अंतर्निहित। संश्लेषित गौण विधियों में सिंक्रनाइज़ेशन सक्षम करता है। |
nonatomic | संश्लेषित गौण विधियों में सिंक्रनाइज़ेशन को अक्षम करता है। |
readwrite | अंतर्निहित। गेटटर, सेटर और बैकिंग आइवर को सिंथेसाइज़ करता है। |
readonly | केवल गेटर विधि और बैकिंग आइवर का संश्लेषण करता है, जिसे सीधे सौंपा जा सकता है। |
getter= नाम | गेटर विधि का नाम निर्दिष्ट, निहित है propertyName । |
setter= नाम | सेटर विधि का नाम निर्दिष्ट करता है, setPropertyName: :। बृहदान्त्र : नाम का एक हिस्सा होना चाहिए। |
strong | एआरसी के तहत वस्तुओं के लिए लागू । बैकिंग __strong का उपयोग करके संश्लेषित किया __strong , जो संदर्भित ऑब्जेक्ट के __strong को रोकता है। |
retain | strong पर्यायवाची। |
copy | उतना ही strong , लेकिन संश्लेषित सेटर भी नए मूल्य पर -copy कहता है। |
unsafe_unretained | एआरसी के तहत वस्तुओं को छोड़कर, निहित। बैकिंग __unsafe_unretained का उपयोग करके संश्लेषित किया __unsafe_unretained , जिसके __unsafe_unretained (ऑब्जेक्ट्स के लिए) संदर्भित ऑब्जेक्ट डीलक्लोकेट्स के एक बार सूचक को झूलने में परिणाम करता है। |
assign | unsafe_unretained लिए unsafe_unretained । गैर-वस्तु प्रकारों के लिए उपयुक्त। |
weak | बैकिंग __weak का उपयोग करके संश्लेषित किया __weak , इसलिए संदर्भित ऑब्जेक्ट के __weak पर मूल्य को __weak कर दिया जाएगा। |
class | प्रॉपर्टी ऐक्सेसर्स को इंस्टेंस विधियों के बजाय क्लास मेथड के रूप में संश्लेषित किया जाता है। कोई बैकिंग स्टोरेज संश्लेषित नहीं है। |
nullable | संपत्ति nil मूल्यों को स्वीकार करती है। मुख्य रूप से स्विफ्ट ब्रिजिंग के लिए उपयोग किया जाता है। |
nonnull | संपत्ति nil मानों को स्वीकार नहीं करती है। मुख्य रूप से स्विफ्ट ब्रिजिंग के लिए उपयोग किया जाता है। |
null_resettable | संपत्ति सेटर में nil मान स्वीकार करती है, लेकिन कभी भी गेटर से nil मान वापस नहीं करती है। गेटटर या सेटर का आपका कस्टम कार्यान्वयन इस व्यवहार को सुनिश्चित करता है। मुख्य रूप से स्विफ्ट ब्रिजिंग के लिए उपयोग किया जाता है। |
null_unspecified | अंतर्निहित। संपत्ति nil मानों को संभालने को निर्दिष्ट नहीं करती है। मुख्य रूप से स्विफ्ट ब्रिजिंग के लिए उपयोग किया जाता है। |
गुण क्या हैं?
यहाँ एक उदाहरण वर्ग दिया गया है, जिसमें गुणों का उपयोग किए बिना कुछ उदाहरण चर हैं:
@interface TestClass : NSObject {
NSString *_someString;
int _someInt;
}
-(NSString *)someString;
-(void)setSomeString:(NSString *)newString;
-(int)someInt;
-(void)setSomeInt:(NSString *)newInt;
@end
@implementation TestClass
-(NSString *)someString {
return _someString;
}
-(void)setSomeString:(NSString *)newString {
_someString = newString;
}
-(int)someInt {
return _someInt;
}
-(void)setSomeInt:(int)newInt {
_someInt = newInt;
}
@end
यह एक सरल उदाहरण चर बनाने के लिए बहुत सारे बॉयलरप्लेट कोड है। आपको इंस्टेंस वेरिएबल बनाना होगा और एक्सेसर मेथड बनाना होगा, जो इंस्टेंस वेरिएबल को सेट या वापस करने के अलावा कुछ नहीं करता है। इसलिए ऑब्जेक्टिव-सी 2.0 के साथ, ऐप्पल ने प्रॉपर्टीज़ पेश कीं, जो बॉयलरप्लेट कोड के कुछ या सभी ऑटो उत्पन्न करते हैं।
यहाँ गुणों के साथ फिर से लिखा गया है:
@interface TestClass
@property NSString *someString;
@property int someInt;
@end
@implementation testClass
@end
एक संपत्ति एक उदाहरण चर है जो ऑटो-जेनरेट होने वाले गेटर्स और सेटर्स के साथ जोड़ा जाता है। एक संपत्ति बुलाया के लिए someString
, गेटर और सेटर कहा जाता है someString
और setSomeString:
क्रमशः। उदाहरण चर के नाम, डिफ़ॉल्ट रूप से, संपत्ति के नाम पर एक अंडरस्कोर के साथ उपसर्ग जाता है (क्योंकि के लिए उदाहरण चर someString
कहा जाता है _someString
, लेकिन यह एक साथ अधिरोहित जा सकता @synthesize
में निर्देश @implementation
अनुभाग:
@synthesize someString=foo; //names the instance variable "foo"
@synthesize someString; //names it "someString"
@synthesize someString=_someString; //names it "_someString"; the default if
//there is no @synthesize directive
संपत्तियों को गेटर्स और कॉलर्स द्वारा एक्सेस किया जा सकता है:
[testObject setSomeString:@"Foo"];
NSLog(@"someInt is %d", [testObject someInt]);
उन्हें डॉट नोटेशन का उपयोग करके भी एक्सेस किया जा सकता है:
testObject.someString = @"Foo";
NSLog(@"someInt is %d", testObject.someInt);
कस्टम गेटर्स और सेटर
डिफ़ॉल्ट संपत्ति पाने वाले और बसने वालों को ओवरराइड किया जा सकता है:
@interface TestClass
@property NSString *someString;
@end
@implementation TestClass
// override the setter to print a message
- (void)setSomeString:(NSString *)newString {
NSLog(@"Setting someString to %@", newString);
// Make sure to access the ivar (default is the property name with a _
// at the beginning) because calling self.someString would call the same
// method again leading to an infinite recursion
_someString = newString;
}
- (void)doSomething {
// The next line will call the setSomeString: method
self.someString = @"Test";
}
@end
यह प्रदान करने के लिए उपयोगी हो सकता है, उदाहरण के लिए, आलसी इनिशियलाइज़ेशन (यदि यह अभी तक सेट नहीं किया गया है, तो प्रारंभिक मूल्य निर्धारित करने के लिए गेटर को ओवरराइड करके):
- (NSString *)someString {
if (_someString == nil) {
_someString = [self getInitialValueForSomeString];
}
return _someString;
}
आप एक ऐसी संपत्ति भी बना सकते हैं जो पाने वाले में इसके मूल्य की गणना करती है:
@interface Circle : NSObject
@property CGPoint origin;
@property CGFloat radius;
@property (readonly) CGFloat area;
@end
@implementation Circle
- (CGFloat)area {
return M_PI * pow(self.radius, 2);
}
@end
गुण जो अद्यतन का कारण बनते हैं
इस वस्तु, Shape
एक संपत्ति है image
है कि पर निर्भर करता है numberOfSides
और sideWidth
। यदि उनमें से कोई एक सेट है, तो image
को पुनर्गणना करना होगा। लेकिन पुनर्गणना संभवत: लंबी है, और दोनों गुणों के सेट होने पर केवल एक बार किया जाना चाहिए, इसलिए Shape
दोनों गुणों को सेट करने का एक तरीका प्रदान करती है और केवल एक बार पुनर्गणना करती है। यह संपत्ति ivars को सीधे सेट करके किया जाता है।
Shape.h
@interface Shape {
NSUInteger numberOfSides;
CGFloat sideWidth;
UIImage * image;
}
// Initializer that takes initial values for the properties.
- (instancetype)initWithNumberOfSides:(NSUInteger)numberOfSides withWidth:(CGFloat)width;
// Method that allows to set both properties in once call.
// This is useful if setting these properties has expensive side-effects.
// Using a method to set both values at once allows you to have the side-
// effect executed only once.
- (void)setNumberOfSides:(NSUInteger)numberOfSides andWidth:(CGFloat)width;
// Properties using default attributes.
@property NSUInteger numberOfSides;
@property CGFloat sideWidth;
// Property using explicit attributes.
@property(strong, readonly) UIImage * image;
@end
Shape.m
@implementation AnObject
// The variable name of a property that is auto-generated by the compiler
// defaults to being the property name prefixed with an underscore, for
// example "_propertyName". You can change this default variable name using
// the following statement:
// @synthesize propertyName = customVariableName;
- (id)initWithNumberOfSides:(NSUInteger)numberOfSides withWidth:(CGFloat)width {
if ((self = [self init])) {
[self setNumberOfSides:numberOfSides andWidth:width];
}
return self;
}
- (void)setNumberOfSides:(NSUInteger)numberOfSides {
_numberOfSides = numberOfSides;
[self updateImage];
}
- (void)setSideWidth:(CGFloat)sideWidth {
_sideWidth = sideWidth;
[self updateImage];
}
- (void)setNumberOfSides:(NSUInteger)numberOfSides andWidth:(CGFloat)sideWidth {
_numberOfSides = numberOfSides;
_sideWidth = sideWidth;
[self updateImage];
}
// Method that does some post-processing once either of the properties has
// been updated.
- (void)updateImage {
...
}
@end
जब गुण ( object.property = value
का उपयोग करके) असाइन किए जाते हैं, तो सेटर विधि setProperty:
कहा जाता है। इस सेटर, भले ही द्वारा प्रदान की @synthesize
,, अधिरोहित जा सकता है के रूप में यह करने के लिए इस मामले में है numberOfSides
और sideWidth
। हालाँकि, यदि आप किसी संपत्ति के ivar को सीधे सेट करते हैं ( property
माध्यम से यदि ऑब्जेक्ट स्वयं, या ऑब्जेक्ट- object->property
), तो यह गेट्टर या सेटर को कॉल नहीं करता है, आपको कई संपत्ति सेट जैसी चीजें करने की अनुमति देता है जो केवल एक अपडेट या कॉल करते हैं सेटर के कारण होने वाले दुष्प्रभाव।