然后大体是为了必赢体育

作者:必赢体育

前言:

好久没写文章了,近日首先重构IT恋、又重写IT恋中。

Sagit框架也持续的换代,调解,将来感到到已完美了了相当多。

前日不写教程,先简单分享一下本领内容。

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

 旧事要从那这里聊起:

必赢体育 1

那会儿番完那代码后,发掘各市都有那个鬼东西,然后就去百度了一下,然后概况是为了:

消除双向引用导致的内部存款和储蓄器不能自由难点

差不离的表达如下:

self   强引用指向=》block;

block 也强引用批向=>self;

这时候就出事了,消除的措施是,把内部二个改成弱指向。

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

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

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

2:别的场景的双向援引:UIViewController与UIView的郁结

 首先,暗许UIViewController有贰个强援引指向了UIView,那是系统定义的,我们改不了:

必赢体育 2

于是,假使UIView里再冒出strong或retain指回UIController,就能够导致UIViewController和UIView双双不能够自由难题。

这么些主题素材,在本人刚写Sagit框架时,只在乎功用,没留意那些,就犯了这几个颠倒是非:

荒诞的写法是这么的:

必赢体育 3

现行反革命改进后的写法是那般的:

必赢体育 4

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上的事件

实施的代码是这么的,由于是动态实践,少不了还会有一个告诫:

必赢体育 5

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

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

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

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

代码是那样的:

必赢体育 6

真难为自个儿那样通晓,想着水到渠成,运营,释放了,成功了!!!

接下来又痛心了:

必赢体育 7

下一场就动不动就到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了。

当今正值竭力抢救!!!化解完再来写下篇!!!

 

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

本文由必赢体育发布,转载请注明来源

关键词: