定义block

无参数无返回值的block 定义格式:

void (^block)() = ^{

NSLog(@"block");

};

有参有返回值的block 定义格式

int (^sum)(int,int) = ^(int a,int b){

return a+b;

};

当然如果block作为成员属性的时候 定义的格式如下:

@property (nonatomic, copy) void(^myBlock)();   //注意这个是block作为成员属性的时候的定义格式

当然这里如果block作为成员属性  我们可以使用typedef为这个block起一个别名 这样就不用每次都写这么长的代码了:

如:

typedef  void(^myBlock)()   //这样就相当于给这个block起了一个别名 叫做  myBlock  那么以后使用的时候 就可以这样使用:

@property (nonatomic, copy) myBlock block;   //注意这个是block作为成员属性的时候的定义格式

当block当做参数传递的时候用如下格式:

+ get:(NSString*)url parames:(NSDictionary*)parames success:(int (^)(int,int))sum;  //这个block是一个有参数有返回值的

+ post:(NSString*)url parames:(NSDictionary*)parames success:(void (^)(id responseObj))responseObj;  //这个block是一个有参数 没有返回值的

即可:也就是说block当做参数的时候 需要把block的名字提取出来放到最后面即可

block其他注意点:

由于Block是默认建立在栈上, 所以如果离开方法作用域, Block就会被丢弃,

 在非ARC情况下, 我们要返回一个Block的话,需要 [Block copy];
 
 在ARC下, 以下几种情况, Block会自动被从栈复制到堆:
  
 1.被执行copy方法
 2.作为方法返回值
 3.将Block赋值给附有__strong修饰符的id类型的类或者Blcok类型成员变量时
 4.在方法名中含有usingBlock的Cocoa框架方法或者GDC的API中传递的时候
 
在非ARC下,只虽一个__block关键词就可以解决循环引用的问题。相对还是简单的。
 
那么在arc模式下 如何解决循环引用的问题呢?
 
很多人以为写个__weak就行了
 
 __weak BlockDemo *demo = [[BlockDemo alloc]init];
如果你这样写 那就犯了很大的错误: 这样定义一个变量  马上就被release 了  如果有
 
解决方法是这样的:
BlockDemo *demo = [[BlockDemo alloc]init];   
__weak typeof(BlockDemo) *weakDemo = demo;
 
注意:
当一个对象中的block块中的访问自己的属性是不会造成循环引用的,因为把自身当作参数传到block中的时候,编译器给我们做了弱引用。因此不会产生循环引用。
 

最新文章

  1. [LeetCode] Minimum Size Subarray Sum 最短子数组之和
  2. Match:Period(POJ 1961)
  3. VirtualBox 网络设置
  4. Timer Design in StatusBar
  5. HDU 5278 PowMod 数论公式推导
  6. WordPress 模板常用函数
  7. MYSQL一对多,两表查询合并数据
  8. The initialize list of C++ Class
  9. No2_3.接口继承多态_Java学习笔记_多态
  10. DB2的基础指令 学习笔记
  11. Pelican搭建静态博客
  12. 好公司、行业、领导?应届生应根据什么选offer?
  13. 阿里云 virtual memory exhausted: 无法分配内存
  14. SQLite 数据类型(http://www.w3cschool.cc/sqlite/sqlite-data-types.html)
  15. 异步加载js的三种方法
  16. Python中使用PyCharm为函数及参数增加注释
  17. Android SDK manager里面什么是必须下载的?
  18. 3、Qt Project之Socket网络编程
  19. Linux下MySQL5.7.18 yum方式从卸载到安装
  20. 最小生成树(图论)--3366lg【模版】

热门文章

  1. Jquery相册插件(开源下载)
  2. [ZigBee] 10、ZigBee之睡眠定时器
  3. Lucene系列-facet
  4. Redis总结笔记(二):C#连接Redis简单例子
  5. DDD~领域服务的规约模式
  6. Dubbo的使用及原理浅析.
  7. Atitit 图像处理30大经典算法attilax总结
  8. NPM安装之后CMD中不能使用
  9. linker command failed with exit code 1 (use -v to see invocation)
  10. 深入理解HTML表格