ios面试题收集 (不定期更新)
2016-04-26 16:51
555 查看
1. tableview的内存使用注意事项
a. cell 的复用
2. 网络图片加载流程及注意事项
3. ffmpeg代码层面的问题
4. mrc和arc下block的内存分配差别
这个问题也可以描述为 block一般用那个关键字修饰,为什么?
block一般使用copy关键之进行修饰,block使用copy是从MRC遗留下来的“传统”,在MRC中,方法内容的block是在栈区的,使用copy可以把它放到堆区。但在ARC中写不写都行:编译器自动对block进行了copy操作。
5. __bridge的使用说明
扩展 为:
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics、Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环境下编译器不会自动管理CF对象的内存,所以当我们创建了一个CF对象以后就需要我们使用CFRelease将其手动释放,那么CF和OC相互转化的时候该如何管理内存呢?答案就是我们在需要时可以使用__bridge,__bridge_transfer,__bridge_retained,具体介绍和用法如下:
1.__bridge:CF和OC对象转化时只涉及对象类型不涉及对象所有权的转化
2.__bridge_transfer:常用在讲CF对象转换成OC对象时,将CF对象的所有权交给OC对象,
此时ARC就能自动管理该内存;(作用同CFBridgingRelease())
3.__bridge_retained:(与__bridge_transfer相反)常用在将OC对象转换成CF对象时,
将OC对象的所有权交给CF对象来管理;(作用同CFBridgingRetain())
a. cell 的复用
dequeueReusableCellWithIdentifier,从字面上理解是“出列的可重用的cell”,其实简单说就是一个cell池,里面放的就是你之前创建过的cell。使用时要注意:
1。重取出来的cell是有可能已经捆绑过数据或者加过子视图的,所以,如果有必要,要清除数据(比如textlabel的text)和remove掉add过的子视图(使用tag)。
2。这样设计的目的是为了避免频繁的 alloc和delloc cell对象而已,没有多复杂。
3。设计的关键是实现cell和数据的完全分离
关键点在"一个屏幕显示的cell数量"是有限的
当屏幕滚动时候,就会调用方法获取新的cell,而老的cell会在屏幕外面就不显示了
reuse机制就是这样。。当cell需要显示的时候,从queue里面找,找到了,设置一下内容,显示出来
滚动界面当有cell被移出屏幕时,把这个cell丢到queue里面
显示新的cell时,如果有“相同类型”(identifier)的cell,就从队列拿一个出来,设置数据,显示出来
至于queue里面会有多少cell,这个会自动控制
b.
必须把自定义的控件添加在cell的contentView上,而不是view上
避免反复的调整Cell的布局(Avoid relayout of content)
只在创建每一个Cell的时候布局一次,而不要每一次获取Cell的时候都去重新布局。
避免透明的subviews (Use opaque subviews)
自定义cell的时候,尽可能避免使用透明的控件,因为透明控件在table滑动时将增大渲染开销。
原文链接:http://www.jianshu.com/p/f30eab24401f
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
2. 网络图片加载流程及注意事项3. ffmpeg代码层面的问题
4. mrc和arc下block的内存分配差别
这个问题也可以描述为 block一般用那个关键字修饰,为什么?
block一般使用copy关键之进行修饰,block使用copy是从MRC遗留下来的“传统”,在MRC中,方法内容的block是在栈区的,使用copy可以把它放到堆区。但在ARC中写不写都行:编译器自动对block进行了copy操作。
5. __bridge的使用说明
扩展 为:
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics、Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环境下编译器不会自动管理CF对象的内存,所以当我们创建了一个CF对象以后就需要我们使用CFRelease将其手动释放,那么CF和OC相互转化的时候该如何管理内存呢?答案就是我们在需要时可以使用__bridge,__bridge_transfer,__bridge_retained,具体介绍和用法如下:
1.__bridge:CF和OC对象转化时只涉及对象类型不涉及对象所有权的转化
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"]; CFURLRef ref = (CFURLRef)url;上面的这段代码在ARC环境下系统会给出错误提示和错误修正,修正后如下:
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"]; CFURLRef ref = (__bridge CFURLRef)url;系统为我们自动添加了__bridge,因为是OC创建的对象并且在转换时没有涉及对象所有权的转换,所以上面的代码不需要加CFRelease
2.__bridge_transfer:常用在讲CF对象转换成OC对象时,将CF对象的所有权交给OC对象,
此时ARC就能自动管理该内存;(作用同CFBridgingRelease())
CFStringRef cfString= CFURLCreateStringByAddingPercentEscapes( NULL, (__bridge CFStringRef)text, NULL, CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); NSString *ocString = (__bridge_transfer CFStringRef)cfString;此时OC即获得了对象的所有权,ARC负责自动释放该对象,如果我们在结尾加上CFRelease(cfString)纯属画蛇添足,虽不会崩溃,但是控制台会打印出该对象被free了两次。
3.__bridge_retained:(与__bridge_transfer相反)常用在将OC对象转换成CF对象时,
将OC对象的所有权交给CF对象来管理;(作用同CFBridgingRetain())
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"]; CFURLRef ref = (__bridge_retained CFURLRef)url; CFRelease(ref);
当使用_bridge_retained标识符以后,代表OC要将对象所有权交给CF对象自己来管理,所以我们要在ref使用完成以后用CFRelease将其手动释放.
相关文章推荐
- 前端初级工程师面试题
- 前端面试题集锦
- 奋斗吧,程序员——第十六章 笑渐不闻声渐悄,多情却被无情恼
- 转行程序员1 机器学习 线性回归 Linear Regression 纯属敦促自己学习
- 剑指offer-面试题53:正则表达式匹配
- 第二个面试整理
- 性能测试面试题
- CSV解析器,CSV解释器,新媒传信上机题,新媒传信面试,java解析csv
- Java正影响着一代程序员
- 程序员笑话大全,程序员的这108个笑话,你都看得懂吗?
- 程序员求职面试三部曲之一:选择合适的工作单位(转)
- 关于sizeof的面试题,回答很好地解释了sizeof的相关特性
- 阿里面试
- 【面试题解答】如何在一个对象释放的时候收到通知
- 剑指offer之面试题23:从上往下打印二叉树
- 对程序员说的一些话
- 如何准备阿里社招面试,顺谈Java程序员学习中各阶段的建议
- web前端面试题:
- iTerm2-程序员必备神器(Mac)
- 大神博客地址列表