Block基本概念

本小节知识点:

  1. 【了解】什么是Block
  2. 【理解】block的格式

1.什么是Block

  • Block是iOS中一种比较特殊的数据类型

  • Block是苹果官方特别推荐使用的数据类型, 应用场景比较广泛

    • 动画
    • 多线程
    • 集合遍历
    • 网络请求回调
  • Block的作用

    • 用来保存某一段代码, 可以在恰当的时间再取出来调用
    • 功能类似于函数和方法

2.block的格式

  • Block的定义格式
返回值类型 (^block变量名)(形参列表) = ^(形参列表) {

};

  • block最简单形式
void (^block名)() = ^{代码块;}

例如:
void (^myBlock)() = ^{ NSLog(@"李南江"); };
  • block带有参数的block的定义和赋值
void (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; } 例如:
void (^myBlock)(int) = ^(int num){ NSLog(@"num = %i", num); };
  • 带有参数和返回值的block
返回类型 (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; } 例如:
int (^myBlock)(int, int) = ^(int num1, int num2){ return num1 + num2; };
  • 调用Block保存的代码
block变量名(实参);

block和typedef的使用

C语言的指向函数指针用法

#import <Foundation/Foundation.h>

int sum(int value1,int value2)
{
return value1 + value2;
}
int minus(int value1,int value2)
{
return value1 - value2;
}
int main(int argc,onst char * argv[])
{
int (*sumP)(int,int);
sumP = sum;
NSLog(@"sum = %i",sumP(20,10)); int (*minusP)(int,int)
minusP = minus;
NSLog(@"minus = %i",minusP(20,10)); return 0;
}

由于相同的部分可以抽离出来,所以需要使用typedef

#import <Foundation/Foundation.h>

int sum(int value1,int value2)
{
return value1 + value2;
}
int minus(int value1,int value2)
{
return value1 - value2;
} typedef int (*calculte)(int,int) int main(int argc,onst char * argv[])
{
calculte sumP = sum;
NSLog(@"sum = %i",sumP(20,10)); calculte minusP = minus;
NSLog(@"minus = %i",minusP(20,10)); return 0;
}

OC的block的用法

#import <Foundation/Foundation.h>

int main(int argc,onst char * argv[])
{
int (^sumBlock)(int,int);
sumBlock = ^(int value1,int value2){
return value1 + value2;
};
NSLog(@"sum = %i",sumBlock(20,10)); int (^minBlock)(int,int);
minBlock = ^(int value1,int value2){
return value1 - value2;
};
NSLog(@"min = %i",minBlock(20,10)); return 0;
}

使用typedef之后:

#import <Foundation/Foundation.h>

typedef int (^calculteBlock)(int,int);

int main(int argc,onst char * argv[])
{
calculteBlock sumBlock = ^(int value1,int value2){
return value1 + value2;
};
NSLog(@"sum = %i",sumBlock(20,10)); calculteBlock minBlock = ^(int value1,int value2){
return value1 - value2;
};
NSLog(@"min = %i",minBlock(20,10)); return 0;
}

block的应用场景

在学习UI之后就会体会到block的好处。

这段代码要多练习,练习到不用看源码就能熟练敲出来。

#import <Foundation/Foundation.h>

void Hello(void (^func)())
{
NSLog(@"Hello Wrold~");
func();
NSLog(@"Hello HeYang~");
} void sayHello()
{
Hello(^{
NSLog(@"Hello World,Hello HeYang~");
});
} int main(int argc, const char * argv[]) {
@autoreleasepool {
sayHello();
}
return 0;
}

举个block应用实例场景:

需求:
找到需要读取并需要操作的文件
步骤:
读取文件
操作文件
关闭文件
分析:
其中读取文件和关闭文件都是一样的
而操作文件,会根据需求而变化,或者根据文件类型而不一样
总结:
这里就需要使用block把操作文件的功能分离出来。

将Objc的m文件编译成C++文件的终端命令:

cc -rewrote-objc xx.m(OC的m文件)

然后在当前目录下就会出现后缀cpp的C++文件。

block是存储在堆中还是在栈中?
默认情况下block存储在栈中,如果对block进行一个copy操作,block会转移到堆中
如果block在栈中,block中访问了外界的对象,那么不会对对象进行retain操作
但如果是block在堆中,block中访问了外界的对象,那么会对外界的对象进行一次retain

在MRC模式下,我们分析一下是不是会出现内存泄露

Person *p = [[Person alloc]init];
NSLog(@"retainCount = %lu",[p retainCount]);
void (^myBlock)() = ^{
NSLog(@"a = %@",p);
NSLog(@"block retainCount = %lu",[p retain]);
}
Block_copy(myBlock); myBlock();

如果在block中访问了外界的对象,一定要给对象加上__block,只要加上了__block,哪怕block在堆中,也不会对外界的对象进行retain。

加了__block就是地址传递,不加__block是值传递。正因为是值传递,所以可以访问其值,或者return返回其值。

Objective-C之Block的更多相关文章

  1. @weakify, @strongify ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify

    首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...

  2. ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify

    首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...

  3. iOS Block中的weakSelf/strongSelf

    Objective C 的 Block 是一个很实用的语法,特别是与GCD结合使用,可以很方便地实现并发.异步任务.但是,如果使用不当,Block 也会引起一些循环引用问题(retain cycle) ...

  4. 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf

    转载,原文: http://blog.lessfun.com/blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block ...

  5. 唐巧的iOS技术博客选摘

    1. 那些被遗漏的objective-c保留字:http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/   2. 使用cr ...

  6. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  7. Objective C block背后的黑魔法

    前言 block在Objective C开发中应用非常广泛,我们知道block会捕获外部对象,也知道使用block要防止循环引用. "知其然而不知其所以然"是一件非常痛苦的事情,那 ...

  8. Objective-C( block的使用)

    block block用来保存一段代码 block的标志:^ block跟函数很像:可以保存代码.有返回值.有形参.调用方式跟调用方法一样 block内部可以访问外面的变量 默认情况下,block内部 ...

  9. 初学Objective - C语法之代码块(block)

    一.block声明 1.无参数,无返回值: void (^sayHi)(); 2.有参数,有返回值: NSInteger (^operateOfValue)(NSInteger num); block ...

  10. Objective的字符串拼接 似乎没有Swift方便,但也可以制做一些较为方便的写法

    NSString *str1 = @"字符串1"; NSString *str2 = @"字符串2"; //在同样条件下,Objective的字符串拼接 往往只 ...

随机推荐

  1. Java -- 获取当前日期、当月月初日期、月末日期

    Learn From:http://blog.csdn.net/sunhuwh/article/details/39161323 public class CalendarTest { public ...

  2. bootstrap插件学习-bootstrap.button.js

    先看bootstrap.button.js的结构 var Button = function ( element, options ){} //构造器 Button.prototype = {} // ...

  3. Character Controller (角色控制器) 中 Move()和SimpleMove() 的区别

    首先给出两者的圣典: CollisionFlagsMove(Vector3motion); Description A more complex move function taking absolu ...

  4. SpringMVC——对Ajax的处理(包含 JSON 类型)

    一.首先要搞明白的一些事情. 1.从客户端来看,需要搞明白: (1)要发送什么样格式的 JSON 数据才能被服务器端的 SpringMVC 很便捷的处理,怎么才能让我们写更少的代码,如何做好 JSON ...

  5. html5人物图片360度立体旋转

    体验效果:http://hovertree.com/texiao/html5/10.htm 下载:http://hovertree.com/hvtart/bjae/t16oddyt.htm 代码如下: ...

  6. JSChart_页面图形报表

    首先在页头的"head"中加上: $(document).ready(function() { //myData与colors变量  是做演示用的,可以直接赋值给myChart就可 ...

  7. .NET向APNS苹果消息推送通知

    一.Apns简介: Apns是苹果推送通知服务. 二.原理: APNs会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书以确定其为苹果设备):然后,将服务器的信息接收并且 ...

  8. JMS学习(四) Selector详解

    一.前言 在掌握了消息的结构之后,我们接下来看一下JMS的一个重要功能:选择器.有些时候,作为消费者只希望处理自己感兴趣的消息.如果某个消息只有一个消费者,我们可以在让该客户端根据规则来处理自己感兴趣 ...

  9. Spring核心概念之AOP

    一.AOP 的概念 AOP(Aspect Oriented Programming)的缩写,面向切面编程,主要作用就是对代码进行增强处理. 理解面向切面编程的含义:就是在不改变原有程序的基础上为代码增 ...

  10. 干净的停止tomcat/java应用程序

    通常在使用了jdbc或者netty的应用程序中,当shutdown tomcat或java应用程序时,会出现无法停止的情况,报类似如下错误: 严重: The web application [] re ...