讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上)

by admin on 2019年1月12日

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

履行的代码是这么的,由于是动态执行,少不了还有一个告诫:

必发365乐趣网投手机版 1

第二点:拍摄需要小心如何。这多少个您按照你采用的公司要求来就行了,一般选好商家之后,他们会给您安排选礼服时间、拍摄时间、选片时间、校稿日和取件日等。当然也会告诉您拍此前需要预备的事物和急需留意的事项。(假如没有那些,那么仍旧换商家,要么只可以协调问啊)其它还有一些,就是素描场面,一定要和商店规定好拍摄场所。当时给我们看的有广大场面,过去过后察觉就是一大片地,里面有一对光景。后来也许认为照片少,又去了古塔公园拍了部分。。。。。。当时是诚恳无语啊。。。。。所谓的场景,我只好呵呵了。好在室内景还不尽人意。

前言:

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

Sagit框架也频频的翻新,调整,现在倍感已圆满了了相当的多。

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

大家约定是在5月9号,选礼服是在八月12号,拍摄是在7月14号,原计划是十二月2号取件,可是由于公司说成品没有做完,所以推迟到了8月9号(成品没做完还没打电话提前通告,要不是自个儿提前打电话问了一下,自己就要空跑一趟了)。

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

 故事要从这这里说起:

必发365乐趣网投手机版 2

这会儿番完这代码后,发现各地都有其一鬼东西,然后就去百度了刹那间,然后大意是为着:

其三点:选片需要再加照片吗。一般而言,大多数店铺都会在您选片的时候鼓励你多加照片,一张照片的标价几百块钱。在婚博会上听好多商行都说50多张充足了,所以假设要你加照片,请一定要坚决自己的自信心。(当时太天真,我们是65张,但是相关人口说65张放到相册里面会很空虚,没有充裕感,就又加了20张。当时确实是被忽悠了)

总结:

当自己很6的解决完上述问题后,就起来写小说了想分享一下了,然后写了启幕,发现:

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

必发365乐趣网投手机版,因为自身给Cell加了个特性,指向Table,运行,果然,Shit,连Controller和父的UIView都放出了,你UITableView做为子UI居然不自由!!!!

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

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

现在正在竭力抢救!!!解决完再来写下篇!!!

 

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

从8月9号定下来到二月9号完全得到产品,历时153天,也就是5个月左右的刻钟。时间长的紧要缘由有两点:

釜底抽薪双向引用导致的内存不可以自由问题

粗略的发挥如下:

self   强引用指向=》block;

block 也强引用批向=>self;

此时就出事了,解决的法门是,把其中一个改成弱指向。

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

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

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

第四点:校稿一定要过细。在某妻子拍婚纱照过程中最令人不称心的就是校稿了,就是您选过的照片需要精修,然后自己要看一下精修照片,看是不是有题目。当时本身是真想骂人。85张精修照片像没有修过一样,穿帮的多元,照片改了n便,提了n次指出。我想说:精修人员您是用美图秀秀一键美化的么?更令人无语的是,MD
85张相片用邮箱发我,还不收缩,让我一张一张下载,真的是经不住骂街了。

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

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

必发365乐趣网投手机版 3

所以,若是UIView里再出新strong或retain指回UIController,就会促成UIViewController和UIView双双无法自由问题。

其一题材,在自己刚写Sagit框架时,只在意效用,没在意这多少个,就犯了这些似是而非:

谬误的写法是如此的:

必发365乐趣网投手机版 4

今昔纠正后的写法是那般的:

必发365乐趣网投手机版 5

简简单单注意的就这几点,希望拍婚纱照的亲们一定要小心。当时自我得到产品感觉真心不值,套餐价7999,后来加了一些肖像,加起来1W左右。

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

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

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

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

代码是如此的:

必发365乐趣网投手机版 6

真难为自己这样精通,想着大功告成,运行,释放了,成功了!!!

然后又难受了:

必发365乐趣网投手机版 7

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

搜了搜百度,想想要调度内存,这就一个蛋腾,依然靠猜吧。

后来,遵照释放的相继,和结尾的要紧字,大概是这样猜的:

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

于是,我做了一个劳累的决定,在UIController的deallow中写了那样的代码:

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

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

第五点:成品校验是否合格。在某妻子的经历先前时期还不易,总裁的拍照团队。先前时期精修的设计师就不提了(不是一般的low),前期成品还有一张脸花的,说是模板的题材,模板大,照片小,所有现身花脸现象,我想说你们放模板的时候就从不设想这多少个题材么?这里差评!后来一个相册又再一次创制,才不尽人意。

率先点:选哪家拍摄。个人提议最好或者选一些大点的名牌的摄影。假诺时光允许,强烈提出可以先去参预五遍婚博会(了然更多婚博会可关注微信公众号:婚芭莎中国婚博会),在婚博会上有很多拍婚纱照商家,你可以先都询问一下,再评估协调选哪家。

探讨拍婚纱照也终究人生的一件大事了,有必要记录一下。

除此以外,还有就是你的套餐是不是1对1照相,因为许多1对2(这里要看你能否承受1对2拍摄了),也就是一个素描师同时给2对仍旧更多对素描,这样会浪费广大时刻。我们立即的是1对1,从早上的5:30从家里出发到拍照基地,到终极回家的时候是夜间8点左右。1天的照相依然很累的。最好带一些水,零食是顾不上吃的。

实心觉得某妻子不咋样,刚伊始的劳务和视频还差强人意,前期简直不忍直视。我尽管并未选取大韩民国艺匠,不过拍过的同事说还不错,你可以领悟一下南朝鲜艺匠。好多少个同事是在这拍的,效果还不错。

我们是二〇一七年二月9号定下了去某妻子拍婚纱照。先前时期也做了大量调研,包括是影楼好或者工作室好等等。后来考虑仍然要相信大品牌,所有就选了某妻子。

介绍一下拍婚纱照需要专注咋样?

大概介绍,如有其他疑问,随时互换联系。

  2.选片时间推移(想在礼拜二日去选片,但是后边的年华都早已预约完了,所以只好以后推移)

  1.拍婚纱照人太多,需要排期

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图