swift中闭包 OC中Block 解决循环引用

OC 中 全局宏定义

#define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self;

用法如下:

WS(weakself)

[self.tableView addHeaderWithCallback:^{

[weakself requestMemberList];

}];

swift 在比闭包 中使用 weakSelf

weak var weakSelf = self
demo4 {
    // 使用?的好处 就是一旦 self 被释放,就什么也不做
    weakSelf?.view.backgroundColor =
UIColor.redColor()
}

这才是高级方法:

swift 中一个类可以嵌套定义另外类,新增加的类只能被当前类使用

在 swift 中,要解除闭包的 循环引用,可以在闭包定义中使用 [unowned self] 或者 [weak self],其中:

[unowned self] 类似与 OC 中的 unsafe_unretained,如果对象被释放,仍然保留一个 无效引用,不是可选项

[weak self] 类似与 OC 中的 __weak,如果对象被释放,自动指向 nil,更安全

[weak
self] 时时监控性能较差,[unowned self]可能导致野指针错误,如果能够确定对象不会被释放,尽量使用 unowned

例子   懒加载的闭包

lazy var printName:
()->() = { [unowned self] in

print(self.name)

}

// 下面这句不会发生发生循环引用因为执行完就会消失

lazy var title: String = {

print(self.name)

return "Mr. \(self.name)"

}()

时间: 07-04

swift中闭包 OC中Block 解决循环引用的相关文章

IOS中Block的循环引用

@interface DemoObj() @property (nonatomic, strong) NSOperationQueue *queue; @end @implementation DemoObj - (instancetype)init { self = [super init]; if (self) { self.queue = [[NSOperationQueue alloc] init]; } return self; } - (void)dealloc { NSLog(@"

如何在 iOS 中解决循环引用的问题

稍有常识的人都知道在 iOS 开发时,我们经常会遇到循环引用的问题,比如两个强指针相互引用,但是这种简单的情况作为稍有经验的开发者都会轻松地查找出来. 但是遇到下面这样的情况,如果只看其实现代码,也很难仅仅凭借肉眼上的观察以及简单的推理就能分析出其中存在的循环引用问题,更何况真实情况往往比这复杂的多: testObject1.object = testObject2; testObject1.secondObject = testObject3; testObject2.object = tes

iOS开发Block的介绍以及Block的循环引用问题

1:block的循环引用问题最主要记住两点: 如果[block内部]使用[外部声明的强引用]访问[对象A], 那么[block内部]会自动产生一个[强引用]指向[对象A] 如果[block内部]使用[外部声明的弱引用]访问[对象A], 那么[block内部]会自动产生一个[弱引用]指向[对象A] 2: #import "ViewController.h" #import "XMGPerson.h" @interface ViewController () @prop

Block的循环引用详解

1.首先我们创建了一个网络请求工具类 然后storyboard里面去创建了一个导航控制器 并且把它设置为初始控制器   然后拖入一个bar button  --show--到自带的控制器 这个时候运行代码的结果是 x 显然这个时候没有造成循环引用 为什么呢?????????????????? //没有self的时候是没有循环引用的 //tools是一个局部的变量 执行完了就会被释放掉了 //这个时候出现了self没有出现循环引用  控制器也被释放了 //block是右边的finished  fi

iOS开发——Block引起循环引用的解决方案

内存问题始终是软件开发中的头等大事,iOS开发中也不例外,在面试中也是必问的问题.今天我们主要来讲讲Block中涉及的循环引用问题.当我们自己一开始写代码的时候,可能会大量在block中使用self,但是当看到别人优秀的代码的时候,发现别人常常不是用self,而使用weakSelf. 为什么呢?本文的示例代码上传至 https://github.com/chenyufeng1991/Block_WeakSelf . 首先我先来说说内存管理的原则: 1.默认使用strong,可选weak.stro

swift中闭包的循环引用

首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIButton(type: .ContactAdd) bu.addTarget(self, action: "tap", forControlEvents: .TouchUpInside) view.addSubview(bu) run { print("name") sel

block使用小结、在arc中使用block、如何防止循环引用

引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题 : [小测试]你真的知道blocks在Objective-C中是怎么工作的吗?,发现竟然做错了几道, 才知道自己想当然的理解是错误的,所以抽时间学习了下,并且通过一些测试代码进行测试,产生这篇博客. Block简介(copy一段) Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事.需要注意的是由于Objective-C在iOS中不支

OC中内存管理(转)

OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也

检测项目中的循环引用引起的内存问题

说到检测项目中的循环引用 可以有很多手段,其中牛叉的 instruments 当然是把利器. 当然开发过程中往往会大意引起的 循环引用 比如:忘写了 @weakify(self) && @strongify(self); 在大量使用RAC 和 block..... 当然引起这类原因还有很多... 如果分工明确的话可能会再项目结束后,专门测试这块...然而好像并不是每次迭代都会做这块的工作,除非被明确发现引起崩溃的情况. so  要是能把这个工作引入debug 期间,如果引起循环引用 可以抛