1.通信方法:通知:一对多
代理和block:一对一
2.block也称为“闭包”
3.block是一个匿名的函数代码块,此代码块可以作为参数传递给其他对象
4.
声明
block
,前面的
int
表示的是
block
的返回值类型,
括号中的两个
int
表示的是
block
参数的类型,
myBlock
表示的是变量名
int (^myBlock)(int, int);
5.
实现
block
myBlock = ^(
int
a,
int
b){
int
r = a + b;
return
r;
};
6.
调用
block
result = myBlock(10, 40);
NSLog(@"result is %d", result);
7.
void Block
void (^voidBlock)() = ^{
NSLog
(
@"void Block"
);
};
//调用block
voidBlock();
8.
返回一个整形变量,
并且有两个参数作为
block
参数的
block
作为方法的参数
- (
int
)testMethod:(
int
(^)(
int
,
int
))block;
9.
方法没有返回值
,
有一个
block
作为方法的参数
, block
是没有参数和返回值的
- (
void
)testMethod1:(
void
(^)())block;
10.使用
PersonBlock
类型作为参数
- (int)testMethod2:(PersonBlock)block;
11.
一般把
block
的调用和声明放在一个类中,实现放在外部,这样能更好地实现回调功能
12.
局部的基本数据类型变量,进入到
block
中,
num
会变成常量。如果需要在
block
中对
num
进行修改,需要加上关键字
__block (
也可以用
static
关键字进行修饰
)
13. 当没有加上__block时,不能对常量进行自加操作
14.
局部的
OC
对象进入到
block
时
,
该对象会被
retain
一次(注意:
block
在堆区上时才会起到
retain
作用)
15.
在
ARC
中,
__block
关键字不能解决循环引用的问题,因为即使使用了
__block
关键字,它仍旧是一个
strong
类型的对象,进入到
block
块时,仍旧会被
block
持有,这个时候
__block
关键字起的作用仅仅只是表示该指针变量进入到
block
块时是一个可修改的变量
16.
通常情况下,在
block
块中,我们再将
__weak
对象转换成一个
strong
对象
,
为了更方便拿到自身的成员变量