Objective-C Language
वर्ग और वस्तुएँ
खोज…
वाक्य - विन्यास
- बिल्ली * बिल्ली = [[बिल्ली आवंटित] init]; // कैट टाइप की कैट ऑब्जेक्ट बनाएं
- कुत्ता * कुत्ता = [[कुत्ता आवंटित] init]; // टाइप डॉग की डॉग ऑब्जेक्ट बनाएं
- NSObject * someObject = [NSObject आबंटित]; [someObject init]; // ऐसा मत करो
- XYZObject * ऑब्जेक्ट = [XYZObject नया]; // ऑब्जेक्ट्स बनाने के लिए नए का उपयोग करें यदि आरंभीकरण के लिए कोई तर्क आवश्यक नहीं है
- NSString * someString = @ "हैलो, वर्ल्ड!"; // शाब्दिक वाक्य रचना के साथ एक NSString बनाना
- NSNumber * myFloat = @ 3.14f; // शाब्दिक वाक्य रचना का उपयोग करके एक NSNumber बनाने के लिए एक और उदाहरण
- NSNumber * myInt = @ (84/2); // एक बॉक्सिंग अभिव्यक्ति का उपयोग करके एक ऑब्जेक्ट बनाएं
आरंभीकरण मूल्यों के साथ कक्षाएं बनाना
#import <Foundation/Foundation.h>
@interface Car:NSObject {
NSString *CarMotorCode;
NSString *CarChassisCode;
}
- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode;
- (void) startCar;
- (void) stopCar;
@end
@implementation Car
- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode{
CarMotorCode = motorCode;
CarChassisCode = chassisCode;
return self;
}
- (void) startCar {...}
- (void) stopCar {...}
@end
initWithMotorValue: type andChassisValue: type
का उपयोग कार ऑब्जेक्ट्स को इनिशियलाइज़ करने के लिए किया जाएगा।
सिंगलटन क्लास
एक सिंगलटन क्लास क्या है?
एक एकल वर्ग एक ही उदाहरण देता है, चाहे कोई कितनी बार भी आवेदन का अनुरोध करे। एक नियमित वर्ग के विपरीत, एक सिंगलटन ऑब्जेक्ट अपने वर्ग के संसाधनों तक पहुंच का एक वैश्विक बिंदु प्रदान करता है।
सिंगलटन क्लासेस का उपयोग कब करें?
सिंगलटन का उपयोग उन स्थितियों में किया जाता है जहां नियंत्रण का यह एकल बिंदु वांछनीय है, जैसे कि उन कक्षाओं के साथ जो कुछ सामान्य सेवा या संसाधन प्रदान करते हैं।
सिंगलटन क्लासेस कैसे बनाएं
सबसे पहले, एक नई फ़ाइल बनाएं और इसे NSObject
से उप- NSObject
। इसे कुछ भी नाम दें, हम यहां CommonClass
का उपयोग करेंगे। Xcode अब आपके लिए CommonClass.h और CommonClass.m फाइलें जनरेट करेगा।
आपकी CommonClass.h
फ़ाइल में:
#import <Foundation/Foundation.h>
@interface CommonClass : NSObject {
}
+ (CommonClass *)sharedObject;
@property NSString *commonString;
@end
अपने CommonClass.m
फाइल में:
#import "CommonClass.h"
@implementation CommonClass
+ (CommonClass *)sharedObject {
static CommonClass *sharedClass = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedClass = [[self alloc] init];
});
return sharedClass;
}
- (id)init {
if (self = [super init]) {
self.commonString = @"this is string";
}
return self;
}
@end
सिंगलटन क्लासेस का उपयोग कैसे करें
सिंगलटन क्लास जो हमने पहले बनाया था, प्रोजेक्ट में कहीं से भी एक्सेस किया जा सकेगा, जब तक कि आपने संबंधित मॉड्यूल में CommonClass.h
फ़ाइल आयात कर CommonClass.h
। सिंगलटन कक्षा में साझा किए गए डेटा को संशोधित करने और पहुँच के लिए, आपको उस वर्ग जो का उपयोग करके पहुँचा जा सकता है की साझा वस्तु का उपयोग करना होगा sharedObject
निम्नलिखित की तरह विधि:
[CommonClass sharedObject]
साझा वर्ग में तत्वों को पढ़ने या संशोधित करने के लिए, निम्नलिखित करें:
NSString *commonString = [[CommonClass sharedObject].commonString; //Read the string in singleton class
NSString *newString = @"New String";
[CommonClass sharedObject].commonString = newString;//Modified the string in singleton class
"इंस्टेंटेटाइप" रिटर्न प्रकार
ऑब्जेक्टिव-सी एक विशेष प्रकार का समर्थन करता है जिसे `इंस्टेंक्टाइप कहा जाता है जिसे केवल एक विधि द्वारा लौटाए गए प्रकार के रूप में इस्तेमाल किया जा सकता है। यह प्राप्त वस्तु के वर्ग का मूल्यांकन करता है।
निम्नलिखित वर्ग पदानुक्रम पर विचार करें:
@interface Foo : NSObject
- (instancetype)initWithString:(NSString *)string;
@end
@interface Bar : Foo
@end
जब [[Foo alloc] initWithString:@"abc"]
कहा जाता है, संकलक अनुमान लगा सकता है कि वापसी प्रकार Foo *
। Foo
से Bar
वर्ग प्राप्त होता है लेकिन इनिशियलाइज़र की घोषणा को ओवरराइड नहीं करता है। फिर भी, instancetype
, संकलक यह अनुमान लगा सकता है कि [[Bar alloc] initWithString:@"xyz"]
प्रकार Bar *
का मान लौटाता है।
वापसी के प्रकार पर विचार करें -[Foo initWithString:]
Foo *
बजाय: यदि आप कॉल करेंगे [[Bar alloc] initWithString:]
, तो कंपाइलर को अनुमान होगा कि कोई Foo *
वापस आ गया है, न कि Bar *
जैसा कि उसका इरादा है। डेवलपर। instancetype
ने इस समस्या को हल किया।
की शुरूआत से पहले instancetype
, initializers, सिंगलटन accessors और अन्य तरीकों की तरह स्थिर तरीकों कि प्राप्त वर्ग का एक उदाहरण लौटना चाहते एक वापस जाने के लिए की जरूरत id
। समस्या यह है कि id
अर्थ है "किसी भी प्रकार की वस्तु" । कंपाइलर इस प्रकार यह पता लगाने में सक्षम नहीं है कि NSString *wrong = [[Foo alloc] initWithString:@"abc"];
एक गलत प्रकार के साथ एक चर को असाइन कर रहा है।
इस समस्या के कारण, initializers को हमेशा इस्तेमाल करना चाहिए instancetype
बजाय id
वापसी मान के रूप में।
निर्दिष्ट करने वाली पीढ़ी
आप अपनी खुद की कक्षाओं को NSArray
या NSDictionary
तरह जेनेरिक से बढ़ा सकते हैं।
@interface MyClass<__covariant T>
@property (nonnull, nonatomic, strong, readonly) NSArray<T>* allObjects;
- (void) addObject:(nonnull T)obj;
@end
आवंटन और आरंभिक के बीच अंतर
अधिकांश ऑब्जेक्ट ओरिएंटेड भाषाओं में, किसी ऑब्जेक्ट के लिए मेमोरी आवंटित करना और इसे शुरू करना एक परमाणु ऑपरेशन है:
// Both allocates memory and calls the constructor
MyClass object = new MyClass();
ऑब्जेक्टिव-सी में, ये अलग-अलग ऑपरेशन हैं। वर्ग तरीकों alloc
(और इसके ऐतिहासिक भाई allocWithZone:
) ऑब्जेक्टिव-सी क्रम आरक्षित आवश्यक स्मृति और यह साफ करता है बनाता है। कुछ आंतरिक मूल्यों को छोड़कर, सभी गुण और चर 0 / NO
/ nil
NO
सेट हैं।
तब ऑब्जेक्ट पहले से ही "मान्य" है, लेकिन हम हमेशा एक विधि को कॉल करना चाहते हैं जो वास्तव में ऑब्जेक्ट सेट करता है, जिसे हम एक इनिशलाइज़र कहते हैं। ये अन्य भाषाओं में कंस्ट्रक्टर के रूप में एक ही उद्देश्य से काम करते हैं। अधिवेशन द्वारा, इन विधियों की शुरुआत init
। भाषा के दृष्टिकोण से, वे सिर्फ सामान्य तरीके हैं।
// Allocate memory and set all properties and variables to 0/NO/nil.
MyClass *object = [MyClass alloc];
// Initialize the object.
object = [object init];
// Shorthand:
object = [[MyClass alloc] init];