जवाबों:
Objective-C में संपत्तियों का एक विशिष्ट अर्थ है, लेकिन मुझे लगता है कि आप कुछ का मतलब है जो एक स्थिर चर के बराबर है? सभी प्रकार के फू के लिए केवल एक उदाहरण है?
ऑब्जेक्टिव-सी में क्लास फ़ंक्शंस घोषित करने के लिए आप इसके बजाय + उपसर्ग का उपयोग करते हैं - इसलिए आपका कार्यान्वयन कुछ इस तरह दिखाई देगा:
// Foo.h
@interface Foo {
}
+ (NSDictionary *)dictionary;
// Foo.m
+ (NSDictionary *)dictionary {
static NSDictionary *fooDict = nil;
if (fooDict == nil) {
// create dict
}
return fooDict;
}
.
-Accessor वाक्य रचना ऑब्जेक्टिव-सी में गुण से बंधा नहीं है, यह बस एक संकलित-इन शॉर्टकट किसी भी विधि के लिए कि किसी भी आर्ग लेने के बिना रिटर्न कुछ। इस मामले में मैं इसे पसंद करूंगा- मैं व्यक्तिगत रूप से .
किसी भी उपयोग के लिए वाक्यविन्यास पसंद करता हूं, जहां क्लाइंट कोड कुछ पाने का इरादा रखता है, एक कार्रवाई नहीं करता है (भले ही कार्यान्वयन कोड एक बार कुछ बना सकता है, या साइड-इफेक्ट कार्रवाई कर सकता है) । भारी उपयोग के .
सिंटैक्स का परिणाम अधिक-पठनीय कोड में भी होता है: […]
एस का मतलब कुछ महत्वपूर्ण होता है जब .
इसके बजाय सिंटैक्स का उपयोग किया जाता है।
मैं इस समाधान का उपयोग कर रहा हूं:
@interface Model
+ (int) value;
+ (void) setValue:(int)val;
@end
@implementation Model
static int value;
+ (int) value
{ @synchronized(self) { return value; } }
+ (void) setValue:(int)val
{ @synchronized(self) { value = val; } }
@end
और मैंने इसे सिंगलटन पैटर्न के प्रतिस्थापन के रूप में बेहद उपयोगी पाया।
इसका उपयोग करने के लिए, बस अपने डेटा को डॉट नोटेशन के साथ एक्सेस करें:
Model.value = 1;
NSLog(@"%d = value", Model.value);
self
एक कक्षा पद्धति के अंदर पृथ्वी पर क्या मतलब है?
self
वह वस्तु है जिसे संदेश प्राप्त हुआ है । और चूंकि कक्षाएं भी ऑब्जेक्ट हैं , इस मामले में self
इसका मतलब हैModel
@synchronized
?
जैसा कि WWDC 2016 / XCode 8 ( LLVM सत्र @ 5: 05 में नया क्या है ) में देखा गया है। वर्ग के गुणों को निम्नानुसार घोषित किया जा सकता है
@interface MyType : NSObject
@property (class) NSString *someString;
@end
NSLog(@"format string %@", MyType.someString);
ध्यान दें कि वर्ग गुण कभी भी संश्लेषित नहीं होते हैं
@implementation
static NSString * _someString;
+ (NSString *)someString { return _someString; }
+ (void)setSomeString:(NSString *)newString { _someString = newString; }
@end
static
) चर अभी भी घोषित किया जाना चाहिए और उपयोग किया जाना चाहिए, और विधियों को स्पष्ट रूप से लागू किया गया है, जैसा कि वे पहले थे। डॉट सिंटैक्स पहले से ही पहले से ही काम कर रहा है। सभी में, यह वास्तव में है की तुलना में एक बड़ा सौदा की तरह लगता है।
यदि आप कक्षा-स्तरीय समकक्ष के लिए देख रहे हैं @property
, तो उत्तर है "ऐसी कोई बात नहीं है"। लेकिन याद रखें, @property
सिंटैक्टिक शुगर है, वैसे भी; यह सिर्फ उचित रूप से नामित ऑब्जेक्ट तरीके बनाता है।
आप ऐसे क्लास मेथड बनाना चाहते हैं जो स्टैटिक वैरिएबल्स तक पहुँचते हैं, जैसा कि दूसरों ने कहा है, केवल थोड़ा अलग सिंटैक्स है।
UIDevice.currentDevice.identifierForVendor
मेरे लिये कार्य करता है।
यहाँ यह करने का एक सुरक्षित तरीका है:
// Foo.h
@interface Foo {
}
+(NSDictionary*) dictionary;
// Foo.m
+(NSDictionary*) dictionary
{
static NSDictionary* fooDict = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
// create dict
});
return fooDict;
}
ये संपादन सुनिश्चित करते हैं कि fooDict केवल एक बार बनाया गया है।
से एप्पल प्रलेखन : "dispatch_once - एक ब्लॉक वस्तु एक बार और केवल एक आवेदन के जीवन भर के लिए एक बार पर क्रियान्वित।"
Initializer element is not a compile-time constant
:।
Xcode 8 Objective-C के रूप में अब वर्ग गुणों का समर्थन करता है:
@interface MyClass : NSObject
@property (class, nonatomic, assign, readonly) NSUUID* identifier;
@end
चूंकि वर्ग गुण कभी भी संश्लेषित नहीं होते हैं इसलिए आपको अपना कार्यान्वयन लिखने की आवश्यकता होती है।
@implementation MyClass
static NSUUID*_identifier = nil;
+ (NSUUID *)identifier {
if (_identifier == nil) {
_identifier = [[NSUUID alloc] init];
}
return _identifier;
}
@end
आप वर्ग के नाम पर सामान्य डॉट सिंटैक्स का उपयोग करके वर्ग गुणों का उपयोग करते हैं:
MyClass.identifier;
गुणों का मूल्य केवल वस्तुओं में होता है, कक्षाओं में नहीं।
यदि आपको किसी वर्ग की सभी वस्तुओं के लिए कुछ स्टोर करने की आवश्यकता है, तो आपको एक वैश्विक चर का उपयोग करना होगा। आप इसे static
कार्यान्वयन फ़ाइल में घोषित करके छिपा सकते हैं ।
आप अपनी वस्तुओं के बीच विशिष्ट संबंधों का उपयोग करने पर भी विचार कर सकते हैं: आप अपनी कक्षा की एक विशिष्ट वस्तु में मास्टर की भूमिका निभाते हैं और अन्य वस्तुओं को इस मास्टर से जोड़ते हैं। मास्टर एक साधारण संपत्ति के रूप में शब्दकोश को धारण करेगा। मुझे लगता है कि कोकोआ अनुप्रयोगों में पदानुक्रम को देखने के लिए उपयोग किए जाने वाले पेड़ की तरह है।
एक अन्य विकल्प एक समर्पित वर्ग की एक वस्तु बनाना है जो आपके 'वर्ग' शब्दकोश और इस शब्दकोश से संबंधित सभी वस्तुओं के समूह से बना है। यह NSAutoreleasePool
कोको की तरह कुछ है ।
Xcode 8 से शुरू होकर, आप बेरी द्वारा बताए गए वर्ग गुण विशेषता का उपयोग कर सकते हैं ।
हालांकि, कार्यान्वयन में, आपको iVar के बदले में स्थिर वैरिएबल का उपयोग करते हुए वर्ग संपत्ति के लिए क्लास गेट्टर और सेटर दोनों को परिभाषित करने की आवश्यकता होती है।
Sample.h
@interface Sample: NSObject
@property (class, retain) Sample *sharedSample;
@end
Sample.m
@implementation Sample
static Sample *_sharedSample;
+ ( Sample *)sharedSample {
if (_sharedSample==nil) {
[Sample setSharedSample:_sharedSample];
}
return _sharedSample;
}
+ (void)setSharedSample:(Sample *)sample {
_sharedSample = [[Sample alloc]init];
}
@end
यदि आपके पास कई स्तर के गुण हैं तो एक सिंगलटन पैटर्न क्रम में हो सकता है। कुछ इस तरह:
// Foo.h
@interface Foo
+ (Foo *)singleton;
@property 1 ...
@property 2 ...
@property 3 ...
@end
तथा
// Foo.m
#import "Foo.h"
@implementation Foo
static Foo *_singleton = nil;
+ (Foo *)singleton {
if (_singleton == nil) _singleton = [[Foo alloc] init];
return _singleton;
}
@synthesize property1;
@synthesize property2;
@synthesise property3;
@end
अब अपने वर्ग-स्तरीय गुणों को इस तरह एक्सेस करें:
[Foo singleton].property1 = value;
value = [Foo singleton].property2;
dispatch_once
यहां उपयोग करना बहुत आसान होगा ।
[इस समाधान को आज़माएं यह सरल है] आप एक स्विफ्ट वर्ग में एक स्थिर चर बना सकते हैं, फिर इसे किसी भी उद्देश्य-सी कक्षा से बुला सकते हैं।