`
hua397
  • 浏览: 53841 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Block再探

 
阅读更多

    最近面试碰到一个block的问题:写个函数,返回输出int传参的block.之前正好看了ASI怎么宏定义block,就写上了:

 

typedef PrintBlock (^ void)(int num)
- (PrintBlock)getBlock:(int)num {
	return ^(int num){ NSLog(@"%d",num); };
}

     思路体现出来了,不过各种细节错误,囧...

 

 

    其实就考两点,block定义和内存管理.

 

    1.定义,看文档吧:

 

A block variable looks like a function pointer, except with a caret (‘^’) instead of an asterisk (‘*’).
void (^my_block)(void);

     前面加个typedef就成了类型声明,如ASI的:

 

 

typedef void (^ASIXXXBlock)(void)

     PS:昨天看文档的runtime guide,才晓得fuction pointer是咋声明的,果然*跟^渊源很深

 

 

     2.内存管理,关键在于block是栈分配的变量,当前作用域结束它就会释放.文档在此:

 

Memory Management
Internally, a block object is implemented as a function pointer plus context data and optional support routines. It is allocated directly on the stack for efficiency, which means that you need to copy a block to the heap (and release it when you are done) if you want it to persist outside its initial scope.

     再看头文件对dispatch_block_t的定义,会有更直观的印象,因为注释里还举例了^^

 

     至此OK,得到:

typedef void (^PrintBlock)(int num);

@interface ClassA : NSObject {
    
}

+ (PrintBlock)createBlock;

@end


@implementation ClassA

+ (PrintBlock)createBlock {
    PrintBlock block = ^(int num){ NSLog(@"%d",num); };
    return [block copy];
}

@end

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics