接下来大意是为着,然后马虎是为着

然后大意是为了,然后大意是为了

前言:

好久没写小说了,近年来先是重构IT恋、又重写IT恋中。

Sagit框架也频频的换代,调整,以往感觉到已圆满了了非凡的多。

明日不写教程,先简单分享一下技艺内容。

叙述Sagit.Framework化解:双向引用导致的IOS内存泄漏(上),sagit.frameworkios

1:见Block必有:#define WeakSelf __weak typeof(self) this = self;

 故事要从那那里说起:

图片 1

其时番完那代码后,发现所在都有其一鬼东西,然后就去百度了须臾间,然后马虎是为了:

前言:

好久没写作品了,近日第叁重构IT恋、又重写IT恋中。

Sagit框架也不止的翻新,调整,以往感觉已到家了了十分的多。

前天不写教程,先简单分享一下技巧内容。

消除双向引用导致的内存不大概自由难题

总结的表明如下:

self   强引用指向=》block;

block 也强引用批向=>self;

那时候就出事了,消除的不二法门是,把内部3个改成弱指向。

而WeakSelf的定义,就是让block改成弱引用,这样无论self是不是强引用的指向block都无关紧要了。

当然,更精致的做法是:先预判self有没有强引用指向block,没有,就不用WeakSelf定义了。

不过,一般新手搞不明白内涵,无法做出有效的预判,所以见block就有WeakSelf也就相随相生了。

1:见Block必有:#define WeakSelf __weak typeof(self) this = self;

 传说要从那那里说起:

图片 2

当下番完那代码后,发现外省都有其一鬼东西,然后就去百度了弹指间,然后马虎是为着:

2:此外场景的双向引用:UIViewController与UIView的纠缠

 首先,暗中认同UIViewController有一个强引用指向了UIView,那是系统定义的,我们改不了:

图片 3

据此,假诺UIView里再次出出现strong或retain指回UIController,就会促成UIViewController和UIView双双不能自由难点。

以此问题,在自作者刚写Sagit框架时,只在意作用,没在意这么些,就犯了这几个破绽百出:

不当的写法是这般的:

图片 4

到现在更正后的写法是如此的:

图片 5

化解双向引用导致的内存无法自由难点

归纳的表达如下:

self   强引用指向=》block;

block 也强引用批向=>self;

那会儿就出事了,消除的法门是,把其中1个改成弱指向。

而WeakSelf的定义,就是让block改成弱引用,这样无论self是不是强引用的指向block都无关紧要了。

当然,更精致的做法是:先预判self有没有强引用指向block,没有,就不用WeakSelf定义了。

不过,一般新手搞不明白内涵,无法做出有效的预判,所以见block就有WeakSelf也就相随相生了。

3:事情没有这么简单:UIView子控件绑定事件指向Controller

看一行Sagit的代码,关切后边的addClick:

[[[[sagit addButton:@"Login" title:@"登录" font:40] width:450 height:80] onBottom:@"pwdLine" y:149] addClick:@"loginClick"];

对于事件流程关于Sagit的面前几篇有说了,那里说一下框架的流水线代码:

1:系统自动添加了一个UITapGestureRecognizer,并指定到一个固定的click方法;

2:将方法名称和target存到自身的NSDictionary的字典中(框架为每个UIView都扩展了一个Dictionary)(就是这里造成强引用了Controller).

3:事件点击时:先触发系统默认的click,然后click事件:从字典里取出方法名和target,找到SEL并动态执行。

PS:设计成动态执行的好处:可以在执行前处理一些其它事情:比如将addClick参数:loginClick改成AgeButton.click,这样可以分解参数后,去执行AgeButton上的事件

举行的代码是那样的,由于是动态执行,少不了还有二个警戒:

图片 6

2:别的场景的双向引用:UIViewController与UIView的纠缠

 首先,暗许UIViewController有1个强引用指向了UIView,那是系统定义的,大家改不了:

图片 7

之所以,假如UIView里再冒出strong或retain指回UIController,就会导致UIViewController和UIView双双无法自由难题。

这些题材,在本身刚写Sagit框架时,只在意成效,没在意这几个,就犯了这些指鹿为马:

荒谬的写法是那样的:

图片 8

到现在改正后的写法是如此的:

图片 9

接下去,就是怎么消灭事件里对Controller的强引用:

1:找了资料,发现有个NSMapTable,是弱引用的字典,于是把NSDictionary换成它,结果:参不忍睹,界面错乱。【大概是弱引用特别容易丢失数据】 

2:尝试用一个全局的第三方的字典来存,结果也悲哀了!

3:最后想到了一个方法,不直接存Controller,只存字符串:1和0 ,在最终执行的时候,再去找。

代码是那般的:

图片 10

真难为自家这么了解,想着水到渠成,运维,释放了,成功了!!!

接下来又痛楚了:

图片 11

接下来就动不动就到main含数了,让自个儿怎么猜?说好的全局断点呢?你咋不断呢?

搜了搜百度,想想要调度内存,那就一个蛋腾,照旧靠猜吧。

新生,依照释放的逐条,和终极的主要性字,大约是那样猜的:

控制器被释放了,这时候UIView还没释放,然后系统又给UIView绑字的事件发消息,结果遇到野指针,悲伤的故事发生了。

于是乎,小编做了1个不方便的操纵,在UIController的deallow中写了这样的代码:

-(void)dealloc
{
    [self.view removeAllsubViews];//处理内存释放后的异常。
    NSLog(@"%@ ->UIViewControlelr relase", [self class]);
}

这执行dealloc前,毕竟Controller依然活着的,这时候赶紧把UIView的事物给清了,然后,发现完美,运转起来很6!

3:事情没有这么简单:UIView子控件绑定事件指向Controller

看一行Sagit的代码,关心前面的addClick:

[[[[sagit addButton:@"Login" title:@"登录" font:40] width:450 height:80] onBottom:@"pwdLine" y:149] addClick:@"loginClick"];

对于事件流程关于Sagit的目前几篇有说了,那里说一下框架的流水线代码:

1:系统自动添加了一个UITapGestureRecognizer,并指定到一个固定的click方法;

2:将方法名称和target存到自身的NSDictionary的字典中(框架为每个UIView都扩展了一个Dictionary)(就是这里造成强引用了Controller).

3:事件点击时:先触发系统默认的click,然后click事件:从字典里取出方法名和target,找到SEL并动态执行。

PS:设计成动态执行的好处:可以在执行前处理一些其它事情:比如将addClick参数:loginClick改成AgeButton.click,这样可以分解参数后,去执行AgeButton上的事件

执行的代码是如此的,由于是动态执行,少不了还有一个警示:

图片 12

总结:

当自个儿很6的化解完上述难题后,就起来写作品了想分享一下了,然后写了起来,发现:

哎,好像UITableView和UITableViewCell,好像也有双向引用难题。

因为自身给Cell加了个属性,指向Table,运转,果然,Shit,连Controller和父的UIView都放出了,你UITableView做为子UI居然不自由!!!!

没天理,继续折腾,然后UITableView搞释放了,又发现UITableViewCell不自由了(那个Cell平日又会是一大堆UI)。

再然后,发现Push两层回来,又挂Crash了。

近年来正在全力救援!!!化解完再来写下篇!!!

 

操,发现为了释放那一点内存的代价,折腾起来真惨过不自由算了〜〜〜〜

接下去,就是怎么消灭事件里对Controller的强引用:

1:找了资料,发现有个NSMapTable,是弱引用的字典,于是把NSDictionary换成它,结果:参不忍睹,界面错乱。【大概是弱引用特别容易丢失数据】 

2:尝试用一个全局的第三方的字典来存,结果也悲哀了!

3:最后想到了一个方法,不直接存Controller,只存字符串:1和0 ,在最终执行的时候,再去找。

代码是如此的:

图片 13

真难为自身这么明白,想着水到渠成,运转,释放了,成功了!!!

接下来又难过了:

图片 14

下一场就动不动就到main含数了,让自个儿怎么猜?说好的大局断点呢?你咋不断呢?

搜了搜百度,想想要调度内存,这就三个蛋腾,照旧靠猜吧。

后来,按照释放的顺序,和结尾的要紧字,大概是那般猜的:

控制器被释放了,这时候UIView还没释放,然后系统又给UIView绑字的事件发消息,结果遇到野指针,悲伤的故事发生了。

于是,我做了多个不方便的操纵,在UIController的deallow中写了那般的代码:

-(void)dealloc
{
    [self.view removeAllsubViews];//处理内存释放后的异常。
    NSLog(@"%@ ->UIViewControlelr relase", [self class]);
}

那执行dealloc前,终归Controller依然活着的,那时候赶紧把UIView的东西给清了,然后,发现完美,运行起来很6!

总结:

当自身很6的缓解完上述难题后,就起始写作品了想分享一下了,然后写了起初,发现:

嗬,好像UITableView和UITableViewCell,好像也有双向引用难题。

因为作者给Cell加了个属性,指向Table,运营,果然,Shit,连Controller和父的UIView都放出了,你UITableView做为子UI居然不自由!!!!

没天理,继续折腾,然后UITableView搞释放了,又发现UITableViewCell不自由了(那么些Cell经常又会是一大堆UI)。

再然后,发现Push两层回来,又挂Crash了。

未来正在极力营救!!!化解完再来写下篇!!!

 

操,发现为了释放那一点内存的代价,折腾起来真惨过不自由算了〜〜〜〜

http://www.bkjia.com/IOSjc/1261174.htmlwww.bkjia.comtruehttp://www.bkjia.com/IOSjc/1261174.htmlTechArticle讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上),sagit.frameworkios
前言: 好久没写小说了,如今第2重构IT恋、又重写IT恋中。 Sa…