OC 中 全局宏定义 #define WS(weakSelf) __weak __typeof(&*self)weakSelf = self; 用法如下: WS(weakself) [self.tableView addHeaderWithCallback:^{ [weakself requestMemberList]; }]; swift 在比闭包 中使用 weakSelf weak var weakSelf = self demo4 { // 使用?的好处 就是一旦 self 被释
retain cycle 的产生 说到retain cycle,首先要提一下Objective-C的内存管理机制. 作为C语言的超集,Objective-C延续了C语言中手动管理内存的方式,但是区别于C++的极其非人道的内存管理,Objective-C提出了一些机制来减少内存管理的难度. 比如:内存计数. 在 Objective-C中,凡是继承自NSObject的类都提供了两种方法,retain和release.当我们调用一个对象的retain时,这个 对象的内存计数加1,反之,当我们调用rel
定义:循环引用可以简单理解为A引用了B,而B又引用了A,双方都同时保持对方的一个引用,导致任何时候引用计数都不为0,始终无法释放: 造成循环引用的三种情况 计时器NSTimer 原因分析: NSTimer变量通过target对xxxModel有强引用,NSTimer变量是xxxModel内部的成员变量,所以xxxModel对该成员变量有强引用 解决办法: 提供类似cleanTimer的公开方法,让外界主动调用释放NSTimer变量 block 原因分析: 某个类将block作为自己的属性变量,
造成循环引用的原因: 比如在main函数中创建了两个类的对象A和B,现在引用计数都是1.现在让A和B互相引用(A有一个属性是B对象),属性说明是retain,B有一个属性是A的对象,属性说明是retain),现在两个对象的引用计数都增加1,都变成2. 现在执行[A release]; [B release]; 此时创建出来得main函数已经释放了自己对对象的持有权,但此时A和B的引用计数都还是1,因为他们互相引用了. 这时你发现A和B将无法释放,因为想要释放A必须先释放B,在B的的dealloc
在之前的一片文章中,我们介绍了数组操作对象的时候引用问题以及自动释放池的概念: http://blog.csdn.net/jiangwei0910410003/article/details/41926183 今天我们继续来看一下引用计数中一个痛疼的问题:循环引用 关于循环引用的问题,这里就不做太多解释了,就是多个对象之间相互引用,形成环状. 来看一个具体的例子: Dog类和Person类之间相互引用 Dog.h // // Dog.h // 29_CyclePointer // // Crea
在之前的一片文章中,我们介绍了数组操作对象的时候引用问题以及自动释放池的概念,今天我们继续来看一下引用计数中一个痛疼的问题:循环引用 关于循环引用的问题,这里就不做太多解释了,就是多个对象之间相互引用,形成环状. 来看一个具体的例子:Dog类和Person类之间相互引用 Dog.h 1 // 2 // Dog.h 3 // 29_CyclePointer 4 // 5 // Created by jiangwei on 14-10-13. 6 // Copyright (c) 2014年 jia
(一)@class的用处 [email protected]的作用:仅仅告诉编译器,某个名称是一个类(#import "Person.h"是要包含所有的方法声明,每次都要复制,不利于提高性能) @class Person; // 仅仅告诉编译器,Person是一个类(要实现方法还要在.m文件中包含Person头文件) 2.开发中引用一个类的规范 1> 在.h文件中用@class来声明类 2> 在.m文件中用#import来包含类的所有东西 (二)两端循环引用解决方案 第一类
一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成引用计数加1:而strong则相当于OC中规定retain,它会造成引用计数加1”. ARC的原理:只要还有一个变量指向对象,对象就会保持在内存中.当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放.这条规则对于实例变量.synthesize属性.局部变量都是适用的 strong指针能够保
PDF版下载:http://download.csdn.net/detail/cuibo1123/7443125 在Objective-C中,内存的引用计数一直是一个让人比较头疼的问题.尤其是当引用计数涉及到arc.blocks等等的时候.似乎ARC的出现只是让我们解放了双手,由于底层实现依然依赖引用计数,所以开启ARC后,只有对引用计数机制更加了解,才能避免Cycle Retain.Crash等问题的出现. 但是由于使用ARC可以显著提高编码效率,所以建议尽量启用arc,本文
首先我们先创造一个循环引用 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