Objective-C Language
ब्लाकों
खोज…
वाक्य - विन्यास
// स्थानीय चर के रूप में घोषित करें:
returnType (^ ब्लॉकनाम) (पैरामीटरटाइप 1, पैरामीटरटाइप 2, ...) = ^ रिटर्नटाइप (तर्क 1, तर्क 2, ...) {...};
// संपत्ति के रूप में घोषित करें:
@property (nonatomic, copy, nullability) returnType (^ ब्लॉकनेम) (पैरामीटरटाइप्स);
// एक विधि पैरामीटर के रूप में घोषित करें:
- (शून्य) someMethodThatTakesABlock: (returnType (^ nullability) (पैरामीटरटाइप्स)) blockName;
// विधि कॉल के तर्क के रूप में घोषित करें:
[someObject someMethodThatTakesABlock: ^ returnType (पैरामीटर) {...}];
// टाइपसेफ के रूप में घोषित करें:
टाइपडिफ रिटर्न टाइप (^ टाइपनेम) (पैरामीटरटाइप्स);
TypeName blockName = ^ returnType (पैरामीटर) {...};
// एक C फ़ंक्शन को एक ब्लॉक ऑब्जेक्ट लौटाएं:
BLOCK_RETURN_TYPE (^ function_name (फ़ंक्शन पैरामीटर)) (BLOCK_PARAMETER_TYPE);
टिप्पणियों
ब्लॉक, सी, ऑब्जेक्टिव-सी, सी ++ और ऑब्जेक्टिव-सी ++ के लिए ब्लॉक के लिए भाषा की विशिष्टता द्वारा निर्दिष्ट किए जाते हैं।
इसके अतिरिक्त, ब्लॉक ABI को ब्लॉक कार्यान्वयन विशिष्टता द्वारा परिभाषित किया गया है।
विधि पैरामीटर के रूप में ब्लॉक
- (void)methodWithBlock:(returnType (^)(paramType1, paramType2, ...))name;
परिभाषित और निरुपित
एक ऐसा ब्लॉक जो दो डबल सटीक संख्याओं को जोड़ने का काम करता है, जो परिवर्ती addition
को सौंपा गया है:
double (^addition)(double, double) = ^double(double first, double second){
return first + second;
};
ब्लॉक को बाद में ऐसा कहा जा सकता है:
double result = addition(1.0, 2.0); // result == 3.0
गुण के रूप में ब्लॉक
@interface MyObject : MySuperclass
@property (copy) void (^blockProperty)(NSString *string);
@end
असाइन करते समय, चूंकि self
blockProperty
बनाए रखता है, ब्लॉक में स्वयं के लिए एक मजबूत संदर्भ नहीं होना चाहिए। उन पारस्परिक मजबूत संदर्भों को एक "चक्र बनाए रखना" कहा जाता है और किसी भी वस्तु की रिहाई को रोक देगा।
__weak __typeof(self) weakSelf = self;
self.blockProperty = ^(NSString *string) {
// refer only to weakSelf here. self will cause a retain cycle
};
यह अत्यधिक संभावना नहीं है, लेकिन self
को ब्लॉक के अंदर कहीं बाहर किया जा सकता है, निष्पादन के दौरान। इस स्थिति में weakSelf
nil
हो जाता है और इसके सभी संदेशों का कोई वांछित प्रभाव नहीं होता है। यह एप्लिकेशन को किसी अज्ञात स्थिति में छोड़ सकता है। ब्लॉक निष्पादन के दौरान __strong
ivar के साथ weakSelf
को बनाए रखने और बाद में साफ करके इससे बचा जा सकता है।
__weak __typeof(self) weakSelf = self;
self.blockProperty = ^(NSString *string) {
__strong __typeof(weakSelf) strongSelf = weakSelf;
// refer only to strongSelf here.
// ...
// At the end of execution, clean up the reference
strongSelf = nil;
};
ब्लॉक टाइपडिफ़्स
typedef double (^Operation)(double first, double second);
यदि आप एक ब्लॉक प्रकार को टाइपराइफ़ घोषित करते हैं, तो आप तर्कों और रिटर्न वैल्यू के पूर्ण विवरण के बजाय नए प्रकार के नाम का उपयोग कर सकते हैं। यह Operation
को एक ब्लॉक के रूप में परिभाषित करता है जो दो डबल्स लेता है और एक डबल लौटाता है।
एक विधि के पैरामीटर के लिए प्रकार का उपयोग किया जा सकता है:
- (double)doWithOperation:(Operation)operation
first:(double)first
second:(double)second;
या एक चर प्रकार के रूप में:
Operation addition = ^double(double first, double second){
return first + second;
};
// Returns 3.0
[self doWithOperation:addition
first:1.0
second:2.0];
टाइपराइफ के बिना, यह बहुत ही गन्दा है:
- (double)doWithOperation:(double (^)(double, double))operation
first:(double)first
second:(double)second;
double (^addition)(double, double) = // ...
स्थानीय चर के रूप में ब्लॉक करता है
returnType (^blockName)(parameterType1, parameterType2, ...) = ^returnType(argument1, argument2, ...) {...};
float (^square)(float) = ^(float x) {return x*x;};
square(5); // resolves to 25
square(-7); // resolves to 49
यहाँ एक उदाहरण है जिसमें कोई रिटर्न नहीं है और कोई पैरामीटर नहीं है:
NSMutableDictionary *localStatus;
void (^logStatus)() = ^(void){ [MYUniversalLogger logCurrentStatus:localStatus]};
// Insert some code to add useful status information
// to localStatus dictionary
logStatus(); // this will call the block with the current localStatus