A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 为梦想挺身而出 于 2014-6-20 18:39 编辑
  1. @class Button;

  2. typedef void (^MyButton)(Button *);


  3. @interface Button : NSObject


  4. @property (nonatomic, assign) MyButton btn;

  5. - (void)click;

  6. @end

  7. #import "Button.h"

  8. @implementation Button

  9. - (void)click
  10. {
  11.     _btn(self);
  12.     _btn(_btn);
  13.    
  14. }

  15. @end
  16. #import <Foundation/Foundation.h>
  17. #import "Button.h"

  18. int main(int argc, const char * argv[])
  19. {

  20.     @autoreleasepool {
  21.         Button *b = [[[Button alloc] init] autorelease];
  22.         
  23.         
  24.         
  25.         
  26.        b.btn = ^(Button *btn){
  27.         
  28.             NSLog(@"点了这个-%@按钮", btn);
  29.        };
  30.         
  31.        [b click];
  32.         
  33.         
  34.     }
  35.     return 0;
  36. }
  37. 这里的click中调用的两个block 输出结果为:
  38. 2014-06-19 19:39:27.913 block作为代理回调[1242:303] 点了这个-<Button: 0x1001144f0>按钮
  39. 2014-06-19 19:39:27.917 block作为代理回调[1242:303] 点了这个-<__NSGlobalBlock__: 0x1000035b0>按钮

  40. 想不通 _btn(self);和_btn(_btn);的区别,求大神解答
复制代码

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

5 个回复

倒序浏览
_btn()期望的参数是Button类对象,所以才有上面的打印结果,Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock。NSGlobalBlock没有使用 Block以外的任何外部变量,Block不需要建立局部变量值的快照,它与函数没有任何区别,存在于代码段。。
回复 使用道具 举报
{:3_46:} 才知道还可以写 _btn(_btn)
回复 使用道具 举报
有区别.
self是本对象!!就是你创建的实例对象,
而_btn是一个block!是你赋值进去的block代码

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报
脸皮猴 发表于 2014-6-19 21:25
有区别.
self是本对象!!就是你创建的实例对象,
而_btn是一个block!是你赋值进去的block代码 ...

懂了,谢谢
回复 使用道具 举报

不谢,哈哈.一起学习.我也是菜菜
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马