ब्लॉक जाने का रास्ता है। आपके पास जटिल पैरामीटर हो सकते हैं, सुरक्षा टाइप कर सकते हैं, और यह यहाँ के अधिकांश पुराने उत्तरों की तुलना में बहुत सरल और सुरक्षित है। उदाहरण के लिए, आप बस लिख सकते हैं:
[MONBlock performBlock:^{[obj setFrame:SOMETHING];} afterDelay:2];
ब्लॉक आपको मनमाने ढंग से पैरामीटर सूची, संदर्भ वस्तुओं और चर पर कब्जा करने की अनुमति देते हैं।
समर्थन कार्यान्वयन (मूल):
@interface MONBlock : NSObject
+ (void)performBlock:(void(^)())pBlock afterDelay:(NSTimeInterval)pDelay;
@end
@implementation MONBlock
+ (void)imp_performBlock:(void(^)())pBlock
{
pBlock();
}
+ (void)performBlock:(void(^)())pBlock afterDelay:(NSTimeInterval)pDelay
{
[self performSelector:@selector(imp_performBlock:)
withObject:[pBlock copy]
afterDelay:pDelay];
}
@end
उदाहरण:
int main(int argc, const char * argv[])
{
@autoreleasepool {
__block bool didPrint = false;
int pi = 3; // close enough =p
[MONBlock performBlock:^{NSLog(@"Hello, World! pi is %i", pi); didPrint = true;} afterDelay:2];
while (!didPrint) {
[NSRunLoop.currentRunLoop runUntilDate:[NSDate dateWithTimeInterval:0.1 sinceDate:NSDate.date]];
}
NSLog(@"(Bye, World!)");
}
return 0;
}
एक अन्य उदाहरण के लिए माइकल का जवाब (+1) भी देखें।