文档章节

iOS开发过程中遇到的坑

w
 wppiwyye
发布于 2015/05/25 20:08
字数 899
阅读 105
收藏 0

1. NSTimer中的target对self进行强引用,导致代码有保留环。

如下代码

__weak typeof(self) weakSelf = self;
scheduledTimerWithTimeInterval:0.1 target:weakSelf
                      selector:@selector(update) userInfo:nil repeats:YES];

其中,对self的引用是强引用,如果不注定调用[_timer invalidate]的话,会导致保留环。更糟糕的是,timer还会一直在后台运行。在《Effective Object-C 2.0》第52个topic讨论过这个问题。个人觉得这是NSTimer接口设计的不好,起码应该提供一个weak版本的类似接口给开发者使用。否则,依靠外部每次stop,很容易导致内存泄露的问题。


2.使用原生View进行拼接,比custom view加drawRect性能要更高。

原生的View如UIImageView,UILabel等做了性能优化,它们不通过drawRect实现自身的绘制。而是使用更高效的方式。在苹果的文档中,多次提到:使用view拼凑的方式,比使用drawRect的方法效率更高。而是用drawRect的方式需要注意不要大量消耗CPU性能,否则有可能导致手机耗电和流畅性。

个人在win32上开发时,对于custom draw使用的还是比较频繁的,并没有任何文档指出该方式会导致性能问题。本人觉得导致ios这个差异的关键点在于:iOS使用空间换时间的方式,对所有的view绘制结果进行了缓存。每个view会对应一个layer,view的绘制首先绘制到layer上。再由compositor进行混合渲染。因此,system view会有优化的空间,如果使用drawRect基本上layer缓存的优化会大打折扣。所以,在ios开发中,会建议使用view平凑的方式得到想要的效果。

参考文档: 

View and Window Architecture


3.对weakSelf进行强引用,得到的是strongSelf

如,下面的代码

__weak typeof(self) weakSelf = self;
__strong typeof(self) strongSelf = weakSelf;

虽然strongSelf引用了一个若引用的self,但是得到的仍然是strongSelf。强弱属性是变量自身的属性,不会在赋值时传递。变量的属性都在声明和定义的时候就定好了。


4.当拖动scrollView时,timer计时器会停止计时,导致计时器相关的UI停止更新的问题。

把计时器用NSRunLoopCommonModes加入到主线程就可以了。

[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];


5.在block中使用局部self强引用strongSelf来防止weakSelf在代码中间被释放。

__weak __typeof__(self) weakSelf = self;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    __strong __typeof(self) strongSelf = weakSelf;
    if (strongSelf == nil) return ;
    [strongSelf doStuff0];
    [strongSelf doStuff1];
    [strongSelf doStuff2];
});

    使用strongSelf,保证在block中self不会被释放,如果使用的是weakSelf,在doStuff0 1 2中的某两个方法之间时,weakSelf可能为空(在调用doStuffx的过程中时,weakSelf不会为空)。如果有类似的多次访问strongSelf又不想每次都坐safeguard的话,可以考虑局部强引用的方式。


6. ARC中的内存问题,release sent to deallocated object问题。

简单来说,在某个dealloc方法中触发了成员变量进行autorelease,但是dealloc过后,该成员变量已经被释放了。这时autorelease再进行release就有可能触发上述crash。如果发生类似事情可以查一下是不是上述原因导致的。参考:release sent to deallocated instance under ARC .. how?


7. 当使用NSTimer驱动View进行更新时,可以在回调中判断view是否可见进行优化。

-(void)timerDidFire {
    if (self.window == nil) {
        return ;
    }
    ...
}



© 著作权归作者所有

w
粉丝 2
博文 12
码字总数 20644
作品 0
合肥
私信 提问
极光开发者沙龙 JIGUANG MEETUP——iOS 技术综合实践

活动背景 相信各位 iOSer 已经在 WWDC 结束后亲身体验过相关的技术。今年 WWDC 后,开发者们要适配的工作并不像以前那么繁重,在各大论坛中也可以搜到相关的技术实战分享。但因为每个公司的技...

极光推送
2017/10/24
0
0
极光开发者沙龙 JIGUANG MEETUP——iOS 技术综合实践

活动背景 相信各位 iOSer 已经在 WWDC 结束后亲身体验过相关的技术。今年 WWDC 后,开发者们要适配的工作并不像以前那么繁重,在各大论坛中也可以搜到相关的技术实战分享。但因为每个公司的技...

极光推送
2017/10/24
1
0
如果坑请深坑之ionic微信开发

第一个是网上很多网友提出的问题:就是安卓机上微信里面无法播放视频的问题,而ios里面却不存在; 这个就要责怪一下傻逼微信了,微信里面调用的浏览器内核是QQ浏览器X5内核,我们在点击自己的...

武文海
2015/07/22
0
0
【开源访谈】施文婷:我眼中的 iOS 开发和技术宅男

对技术、逻辑等能力要求较高的 IT 行业,往往会让人觉得男性更符合行业需求,而现实中也确实是男性占比较高。但可不要因为数量对比就忽视了女性的存在,对于技术,她们同样有着极强的专业素养...

王练
2016/11/07
5.4K
20
开发微信H5视频秀项目遇到的坑

介绍 手头上正好有个项目,需要做一个微信端H5视频秀的一个项目,想想好像挺简单的,由两个视频组成,播放完第一个视频后点击按钮继而播放第二个视频。好了,结果微信的坑TM的多 问题排查 自...

🚲Allen
2018/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C 语言 二级指针的使用

#include <stdio.h>#include <stdlib.h>typedef struct node Node;struct node {int data;struct node* next;struct node* prev;};Node head;Node* insert(Node......

小张525
2分钟前
0
0
【大数据技术】——Hadoop(1)

什么是大数据 基本概念 《数据处理》 在互联网技术发展到现今阶段,大量日常、工作等事务产生的数据都已经信息化,人类产生的数据量相比以前有了爆炸式的增长,以前的传统的数据处理技术已经...

须臾之余
16分钟前
5
0
比特币从地址逆向计算私钥

区块链 区块链简介 说到比特币,就不得不提区块链。那什么是区块链呢? 区块链本质是一个数据集,只不过数据的组织采用了比较特殊的方式,就是把数据拆分为一块一块的小数据集。 为什么要进行...

trayvon
30分钟前
0
0
TypeScript……真香

写前端或者用 node 写命令行小工具一直采用的 es6 的语法,对于 TypeScript 则是秉持敬而远之的态度,毕竟团队中多推广一门语言所需要花费的精力都是让人望而却步的。所以对于 JavaScript 的...

郁也风
36分钟前
3
0
shell基本案例

1、自定义rm linux系统的rm命令太危险,一不小心就会删除掉系统文件。 写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除。下面分两种情况,做...

寰宇01
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部