Blok adalah jalan yang harus ditempuh. Anda dapat memiliki parameter kompleks, jenis keamanan, dan itu jauh lebih sederhana dan lebih aman daripada kebanyakan jawaban lama di sini. Misalnya, Anda bisa menulis:
[MONBlock performBlock:^{[obj setFrame:SOMETHING];} afterDelay:2];
Pemblokiran memungkinkan Anda untuk menangkap daftar parameter arbitrer, objek referensi, dan variabel.
Implementasi Backing (dasar):
@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
Contoh:
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;
}
Lihat juga jawaban Michael (+1) untuk contoh lainnya.