当前位置: 首页 > news >正文

OC Block网上转载

1.block是一个特殊的OC对象, 它建立在栈上, 而不是堆上, 这么做一个是为性能考虑,还有就是方便访问局部变量.

2.默认情况下block使用到的局部变量都会被复制,而不是保留.所以它无法改变局部变量的值.
3.如果在变量面前加上__block, 那么编译器回去不会复制变量, 而是去找变量的地址, 通过地址来访问变量, 实际上就是直接操作变量.
4.另外块是在栈上分配的, 所以一旦离开作用域, 就会释放, 因此如果你要把块用在别的地方, 必须要复制一份.
所以在属性定义一个块的时候需要使用copy:  @property (nonatomic, copy) void (^onTextEntered)(NSString *enteredText);
5.块是不能保留的, retain对块没有意义.
6.使用typed声明block   typedef void(^didFinishBlock) (NSObject *ob); 
这就声明了一个didFinishBlock类型的block,然后便可用@property (nonatomic,copy) didFinishBlock  finishBlock;
声明一个block对象,注意对象属性设置为copy,接到block 参数时,便会自动复制一份。 
__block是一种特殊类型,使用该关键字声明的局部变量,可以被block所改变,并且其在原函数中的值会被改变。

ARC和非ARC中block的区别:
 
ARC下Block何时会从栈自动被复制到推, 以及__block和__weak的使用问题
 
由于Block是默认建立在栈上, 所以如果离开方法作用域, Block就会被丢弃, 在非ARC情况下, 我们要返回一个Block ,需要 [Block copy];
在ARC下, 以下几种情况, Block会自动被从栈复制到堆:
1.被执行copy方法
2.作为方法返回值
3.将Block赋值给附有__strong修饰符的id类型的类或者Blcok类型成员变量时
4.在方法名中含有usingBlock的Cocoa框架方法或者GDC的API中传递的时候.
对于非ARC下, 为了防止循环引用, 我们使用__block来修饰在Block中实用的对象:
__block id blockSelf=self;
self.blk=^{
NSLog(@"%@",blockSelf);  //在非ARC下对于栈上的_block对象, Block不会对其复制, 仅仅使用, 不会增加引用计数.
};
对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中实用的对象:
__weak id weakSelf=self;
self.blk=^{
NSLog(@"%@",weakSelf);
};
如果要在ARC下, 为了防止循环引用, 使用__block来修饰在Block中实用的对象,仍然会被retain, 所以需要多做一些设置
__block id blockSelf=self;
self.blk=^{
NSLog(@"%@",blockSelf);
self.blk=nil;   //blk被释放, blk只有的blockSelf也就被释放了
};
blk();   //并且一定要运行一次, 否则不能被释放
这样就使blk断开了与blockSelf的持有关系.
这么多好处是可以自己控制对self的持有时间.
不过在最新的ios版本中, 这些会始终被已叹号形式提示存在循环引用问题. 
这种书写方式不被推荐. 除非你要在block中修改__block的指针指向.
其实我们用使用__weak修饰符, 只是不能修改对象本身, 但是可以修改对象的属性.

转载于:https://www.cnblogs.com/yulei126/p/6783257.html

相关文章:

  • jQuery与ajax应用
  • [Python基础]Python文件处理小结
  • Android攻城狮Notification实现状态通知栏
  • Atitit 错误处理机制:(1)静默模式(2)警告模式 (3)异常模式
  • 深刻认识shift_ram IP core——图像处理学习笔记
  • 实现简单的ORM
  • python基本运算
  • 备份一下我的.bash_aliases文件
  • vue.js 的起步
  • Bullet Physics OpenGL 刚体应用程序模板 Rigid Simulation in Bullet
  • Unity Shader-简单均值模糊
  • webpack-dev-server 设置反向代理解决跨域问题
  • CF364
  • jsp相关笔记(二)
  • CPU组成
  • ES6指北【2】—— 箭头函数
  • 自己简单写的 事件订阅机制
  • Angular 响应式表单 基础例子
  • CSS中外联样式表代表的含义
  • Druid 在有赞的实践
  • egg(89)--egg之redis的发布和订阅
  • Golang-长连接-状态推送
  • happypack两次报错的问题
  • HashMap ConcurrentHashMap
  • Java IO学习笔记一
  • Java面向对象及其三大特征
  • Linux下的乱码问题
  • php的插入排序,通过双层for循环
  • storm drpc实例
  • Swoft 源码剖析 - 代码自动更新机制
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Vue官网教程学习过程中值得记录的一些事情
  • Web Storage相关
  • Yeoman_Bower_Grunt
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 面试遇到的一些题
  • 前端之React实战:创建跨平台的项目架构
  • 入门级的git使用指北
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 用 Swift 编写面向协议的视图
  • 用Canvas画一棵二叉树
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • #AngularJS#$sce.trustAsResourceUrl
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (第61天)多租户架构(CDB/PDB)
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)Oracle存储过程编写经验和优化措施
  • (转)可以带来幸福的一本书