खोज…


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

  • BOOL hasPlutonium = YES; // प्रत्यक्ष आत्मसात
  • BOOL fastEnough = (car.speedInMPH> = 88); // तुलनात्मक अभिव्यक्ति
  • BOOL fluxCapacitorActive = (hasPlutonium && fastEnough); // बूलियन अभिव्यक्ति
  • id somethingWicked = [witchesCupboard lastObject]; // अप्राप्त वस्तु को पुनः प्राप्त करें
  • आईडी पाउडर = readyWickedIngredient (somethingWicked); // पास और वापसी
  • if ([संघटक isKindOfClass: [टॉड क्लास]]) {// टेस्ट रनटाइम प्रकार

BOOL

BOOL प्रकार का उपयोग उद्देश्य-सी में बूलियन मूल्यों के लिए किया जाता है। अधिक सामान्य "सत्य" और "असत्य" के विपरीत, इसके दो मान हैं, YES और NO

इसका व्यवहार सीधा और सी भाषा के समान है।

BOOL areEqual = (1 == 1);    // areEqual is YES
BOOL areNotEqual = !areEqual    // areNotEqual is NO
NSCAssert(areEqual, "Mathematics is a lie");    // Assertion passes

BOOL shouldFlatterReader = YES;
if (shouldFlatterReader) {
    NSLog(@"Only the very smartest programmers read this kind of material.");
}

एक BOOL एक आदिम है, और इसलिए इसे सीधे एक फाउंडेशन संग्रह में संग्रहीत नहीं किया जा सकता है। इसे एक NSNumber में लपेटा जाना चाहिए। क्लेंग इसके लिए विशेष वाक्यविन्यास प्रदान करता है:

NSNumber * yes = @YES;    // Equivalent to [NSNumber numberWithBool:YES]
NSNumber * no = @NO;    // Equivalent to [NSNumber numberWithBool:NO]

BOOL कार्यान्वयन सीधे C के आधार पर होता है, जिसमें यह C99 मानक प्रकार के bool का एक प्रकार है। YES और NO मान क्रमशः __objc_yes और __objc_no परिभाषित किए गए हैं। ये विशेष मूल्य क्लैंग द्वारा शुरू किए गए कंपाइलर बिल्ड हैं, जिनका अनुवाद (BOOL)1 और (BOOL)0 । यदि वे उपलब्ध नहीं हैं, तो YES और NO को कास्ट-पूर्णांक फॉर्म के रूप में सीधे परिभाषित किया गया है। ऑब्जेक्ट-सी रनटाइम हेडर objc.h में परिभाषाएं पाई जाती हैं

आईडी

id जेनेरिक ऑब्जेक्ट पॉइंटर है, ऑब्जेक्टिव-सी टाइप "किसी भी ऑब्जेक्ट" का प्रतिनिधित्व करता है। किसी भी Objective-C क्लास का एक उदाहरण एक id चर में संग्रहित किया जा सकता है। एक id और किसी अन्य वर्ग प्रकार को कास्टिंग के बिना आगे और पीछे सौंपा जा सकता है:

id anonymousSurname = @"Doe";
NSString * surname = anonymousSurname;
id anonymousFullName = [NSString stringWithFormat:@"%@, John", surname];

संग्रह से वस्तुओं को पुनर्प्राप्त करते समय यह प्रासंगिक हो जाता है। objectAtIndex: जैसे तरीकों की वापसी प्रकार objectAtIndex: बिल्कुल इसी कारण से id हैं।

DataRecord * record = [records objectAtIndex:anIndex];  

इसका अर्थ यह भी है कि id रूप में टाइप किया गया कोई विधि या फ़ंक्शन पैरामीटर किसी भी ऑब्जेक्ट को स्वीकार कर सकता है।

जब कोई ऑब्जेक्ट id रूप में टाइप किया जाता है, तो किसी भी ज्ञात संदेश को पास किया जा सकता है: विधि प्रेषण संकलन-समय प्रकार पर निर्भर नहीं करता है।

NSString * extinctBirdMaybe = 
               [anonymousSurname stringByAppendingString:anonymousSurname];

एक संदेश जो वस्तु वास्तव में प्रतिक्रिया नहीं करता है, फिर भी निश्चित रूप से रनटाइम पर एक अपवाद का कारण होगा।

NSDate * nope = [anonymousSurname addTimeInterval:10];
// Raises "Does not respond to selector" exception

अपवाद के खिलाफ रखवाली।

NSDate * nope;
if([anonymousSurname isKindOfClass:[NSDate class]]){
    nope = [anonymousSurname addTimeInterval:10];
}

id प्रकार को objc.h में परिभाषित किया गया है

typedef struct objc_object {
    Class isa;
} *id;

एसईएल

ऑब्जेक्टिव-सी में विधि पहचानकर्ताओं के रूप में चयनकर्ताओं का उपयोग किया जाता है।

नीचे दिए गए उदाहरण में, दो चयनकर्ता हैं। new और setName:

Person* customer = [Person new];
[customer setName:@"John Doe"];

ब्रैकेट की प्रत्येक जोड़ी एक संदेश भेजने से मेल खाती है। पहली पंक्ति पर हम संदेश युक्त भेजने new करने के लिए चयनकर्ता Person वर्ग और दूसरी पंक्ति पर हम संदेश युक्त भेज setName: चयनकर्ता और एक स्ट्रिंग। इन संदेशों के रिसीवर चयनकर्ता को प्रदर्शन करने के लिए सही कार्रवाई देखने के लिए उपयोग करता है।

अधिकांश समय, ब्रैकेट सिंटैक्स का उपयोग करके पास होने वाला संदेश पर्याप्त होता है, लेकिन कभी-कभी आपको चयनकर्ता के साथ काम करने की आवश्यकता होती है। इन मामलों में, SEL प्रकार का उपयोग चयनकर्ता के संदर्भ को रखने के लिए किया जा सकता है।

यदि चयनकर्ता संकलन समय पर उपलब्ध है, तो आप इसका संदर्भ प्राप्त करने के लिए @selector() का उपयोग कर सकते हैं।

SEL s = @selector(setName:);

और यदि आपको रनटाइम पर चयनकर्ता को खोजने की आवश्यकता है, तो NSSelectorFromString का उपयोग करें।

SEL s NSSelectorFromString(@"setName:");

NSSelectorFromString का उपयोग करते समय, चयनकर्ता का नाम NSString में लपेटना सुनिश्चित करें।

यह आमतौर पर यह जांचने के लिए उपयोग किया जाता है कि कोई प्रतिनिधि वैकल्पिक विधि लागू करता है या नहीं।

if ([self.myDelegate respondsToSelector:@selector(doSomething)]) {
    [self.myDelegate doSomething];
}

छोटा सा भूत (कार्यान्वयन सूचक)

आईएमपी एक सी प्रकार है जो एक पद्धति के कार्यान्वयन का उल्लेख करता है, जिसे कार्यान्वयन सूचक के रूप में भी जाना जाता है। यह एक विधि कार्यान्वयन की शुरुआत के लिए एक संकेतक है।

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

id (*IMP)(id, SEL, …)

छोटा सा भूत द्वारा परिभाषित किया गया है:

typedef id (*IMP)(id self,SEL _cmd,…);

इस ऍक्स्प को एक्सेस करने के लिए, "मेथफ़ॉरसेलेक्टर" संदेश का उपयोग किया जा सकता है।

उदाहरण 1:

IMP ImpDoSomething = [myObject methodForSelector:@selector(doSomething)];

छोटा सा भूत द्वारा adfer विधि छोटा सा भूत dereferencing द्वारा बुलाया जा सकता है।

ImpDoSomething(myObject, @selector(doSomething));

तो ये कॉल बराबर हैं:

 myImpDoSomething(myObject, @selector(doSomething));
[myObject doSomething]
[myObject performSelector:mySelector]
[myObject performSelector:@selector(doSomething)]
[myObject performSelector:NSSelectorFromString(@"doSomething")];

उदाहरण: 2:

SEL otherWaySelector = NSSelectorFromString(@“methodWithFirst:andSecond:andThird:");

IMP methodImplementation  = [self methodForSelector:otherWaySelector];

result = methodImplementation( self,
                          betterWaySelector,
                          first,
                          second,
                          third );

NSLog(@"methodForSelector : %@", result);

यहां, हम [NSObject methodForSelector कहते हैं जो हमें C फ़ंक्शन के लिए एक पॉइंटर देता है जो वास्तव में उस विधि को लागू करता है, जिसे हम बाद में सीधे कॉल कर सकते हैं।

NSInteger और NSUInteger

NSInteger वास्तुकला के आधार पर एक इंट या लंबे समय के लिए सिर्फ एक टाइपराइफ़ है। वही NSUInteger के लिए जाता है, जो अहस्ताक्षरित वेरिएंट के लिए एक टाइफाइड है। यदि आप NSInteger की जाँच करते हैं, तो आप निम्नलिखित देखेंगे:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

एक हस्ताक्षरित और एक अहस्ताक्षरित int या लंबे के बीच का अंतर यह है कि हस्ताक्षरित int या long में नकारात्मक मान हो सकते हैं। Int की रेंज -2 147 483 648 से 2 147 483 647 है जबकि अहस्ताक्षरित int की श्रेणी 0 से 4 294 967 295 है। मान दोगुना है क्योंकि मूल्य को नकारात्मक कहने के लिए पहले बिट का उपयोग नहीं किया जाता है या नहीं। 64-बिट आर्किटेक्चर पर एक लंबे और NSInteger के लिए, सीमा बहुत व्यापक है।

Apple द्वारा प्रदान की जाने वाली अधिकांश विधियाँ सामान्य int पर एक NS (U) पूर्णांक लौटा रही हैं। यदि आप इसे 64-बिट आर्किटेक्चर पर चला रहे हैं तो आप सटीकता खो देंगे, क्योंकि यदि आप सटीकता खो देंगे, तो आपको एक चेतावनी मिल जाएगी। ऐसा नहीं है कि यह ज्यादातर मामलों में मायने रखता है, लेकिन एनएस (यू) इंटेगर का उपयोग करना आसान है। उदाहरण के लिए, एक सरणी पर गणना विधि एक NSUInteger लौटाएगी।

NSNumber *iAmNumber = @0;

NSInteger iAmSigned = [iAmNumber integerValue];
NSUInteger iAmUnsigned = [iAmNumber unsignedIntegerValue];

NSLog(@"%ld", iAmSigned); // The way to print a NSInteger.
NSLog(@"%lu", iAmUnsigned); // The way to print a NSUInteger.

BOOL की तरह, NS (U) इंटेगर एक आदिम डेटाटाइप है, इसलिए आपको कभी-कभी इसे NSNumber में लपेटने की आवश्यकता होती है। आप पूर्णांक से पहले @ का उपयोग करके इसे ऊपर की तरह डाल सकते हैं और नीचे दिए गए तरीकों का उपयोग करके इसे पुनः प्राप्त कर सकते हैं। लेकिन इसे NSNumber करने के लिए, आप निम्न विधियों का भी उपयोग कर सकते हैं:

[NSNumber numberWithInteger:0];
[NSNumber numberWithUnsignedInteger:0];


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