खोज…


वाक्य - विन्यास

  • @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 ), तो यह गेट्टर या सेटर को कॉल नहीं करता है, आपको कई संपत्ति सेट जैसी चीजें करने की अनुमति देता है जो केवल एक अपडेट या कॉल करते हैं सेटर के कारण होने वाले दुष्प्रभाव।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow