Skip to content

Instantly share code, notes, and snippets.

@edom18
Created February 27, 2014 01:57
Show Gist options
  • Save edom18/9242768 to your computer and use it in GitHub Desktop.
Save edom18/9242768 to your computer and use it in GitHub Desktop.
[Objective-C] Blocksがややこいのでまとめてみる ref: http://qiita.com/edo_m18/items/a1ee24cd23d3adde51d8
void (^blk)(void) { NSLog(@"in block"); };
(^blk)() { NSLog(@"in block"); };
typedef int (^blk_t)(int);
blk_t func() {
return ^(int i) { return i * i; };
}
int (^func())(int) {
return ^(int i) { return i * i; };
}
int i = 5;
void (^capTest)() = ^{
printf("%d", i);
};
i = 10;
capTest(); //=> 5になる
clang -rewrite-objc main.m
int func(int i) {
return i + 1;
}
int (*funcptr)(int) = &func;
typedef void (^blk_t)(void); //`blk_t`が型となる
blk_t blk = ^{ NSLog(@"in block"); };
- (void)hogeMethod:(void (^)(NSString *str))blk
{
NSString *test = @"argument";
blk(test);
}
// [Blockの型]には`void (^)(NSString *str)`が入る
- (void)hogeMethod:([Blockの型])blk
{
//
}
void (^anyBlk)(int) = ^void (int i) {
printf("%d", i);
}
anyBlk(10);
void (^)(int i) = …
void (^anyBlk)(int i) = ^void (int i) ...
struct __block_impl {
void *isa;
int Flags;
int Reserved;
void *FuncPtr;
};
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__Block_byref_i_0 *i; // by ref
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __Block_byref_i_0 *_i, int flags=0) : i(_i->__forwarding) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment