OC特有语法—Block
来源:互联网 发布:淘宝客怎样推广店铺 编辑:程序博客网 时间:2024/04/28 22:58
Block:
与函数指针的比较:
有点像函数指针,可以作为参数传递,作为函数返回值
函数指针:
Void (*mypoint)()=test;
mypoint();
block弥补了 指向函数的指针不能够直接保存一个函数体
void (^myBlock)()=^{
}
(1)定义BLOCK变量
Int (^SumBlock)(int,int);//有参数,返回值类型为int
Void (^MyBlock)();//无参数,返回值类型为空
(2)利用block封装代码
(3)Block访问外部变量
1)Block内部可以访问外部变量;
2)默认情况下,Block内部不能修改外部的局部变量
3)给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。
(4)利用typedef定义block类型(和指向函数的指针很像)
Typedef int(^MyBlock)(int ,int);
1)定义block变量:
MyBlock a,b;
a=^(int a,int b){return a-b;};
MyBlock b2=^(int n1,int n2){return n1*n2;}
2)作为参数传递:
-(int)calculateWithNumber1:(int)number1 andNumber2:(int)number2
andCalculateBlock:(MyBlock )calculate
{
}
(3)作为属性:
@property (nonatomic, copy) void (^testBlock)();
// 1.如果没有对block进行copy操作,block就存储于栈空间
// 2.如果对block进行copy操作,block就存储于堆空间
// 3.如果block存储于栈空间,不会对block内部所用到的对象产生强引用
// 4.如果block存储于堆空间,就会对block内部所用到的对象产生强引用
LPerson *p =[[LPerson alloc] init];
//解决办法:
_weak typeof (p) weakP = p;
p.testBlock = ^{
[p run]
}
非ARC:
__block typeof(p) weakP = p;
// p.testBlock = ^{
// [weakP run];
// };
即:
Block的使用注意:
1> block的内存管理
2> 防止循环retian
l 非ARC(MRC):__block
l ARC:__weak\__unsafe_unretained
int age = 10;
void (^block)() = ^{ // 值捕获
NSLog(@"age=%d", age);
};
age = 20;
打印10. __block int age = 10;(可以在block改值,动态取age的值,相当于NSLog(@"age=%d",*&(age)),传的是地址) 打印20 static int age = 10; 打印20
- OC特有语法—Block
- OC语法<3.2> OC中特有的语法:Block数据类型
- OC特有语法—继承
- OC特有语法—多态
- OC特有语法—@property
- OC特有语法—SEL
- OC特有语法—Protocol
- OC语法基础(5)—OC特有
- 黑马程序员(OC特有语法-block和-Protocol)
- OC特有语法—常用结构体
- OC特有语法
- OC---特有语法1
- OC特有语法
- OC--特有语法
- OC特有语法<一>
- OC特有语法<二>
- OC特有语法总结
- Block OC的特有数据类型
- CI中多库连接,不跨服务器
- 求二进制数中1的个数
- solr core 创建的另外一种方法
- 猜拳游戏GuessGame源码
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- OC特有语法—Block
- PHP 邀请码类
- MS DOS 命令大全
- use sleep() to gain thread predictability
- iOS 视图封装及适配
- Java性能优化
- Optimal ArrayMultiplication Sequence
- Android开发之设置60s倒计时
- CocoaPods操作