您的位置:首页 > 职场人生

ios面试题收集 (不定期更新)

2016-04-26 16:51 555 查看
1. tableview的内存使用注意事项

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将其手动释放.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: