面试题总结(二)

(1)Foundation对象与Core Foundation对象有什么区别?

  • Foundation对象是OC对象,Core Foundation对象是C对象
  • 数据类型之间的转换
    ARC:bridge_retained(持有对象所有权,F->CF),bridge_transfer(释放对象所有权CF->F)
    非ARC:__bridge

(2)编写一个函数,实现递归删除指定路径下的所有文件

+ (void)deleteFiles:(NSString *)path
{
    //1.判断文件还是目录
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL isDir = NO;
    BOOL isExist = [fileManager fileExistsAtPath:path isDirectory:&isDir];
    if (isExist) {
        //2.判断是不是目录
        if (isDir) {
            NSArray *dirArray = [fileManager contentsOfDirectoryAtPath:path error:nil];
            NSString *subPath = nil;
            for (NSString *str in dirArray) {
                subPath = [path stringByAppendingPathComponent:str];
                BOOL isSubDir = NO;
                [fileManager fileExistsAtPath:subPath isDirectory:&isSubDir];
                [self deleteFiles:subPath];
            }
        }else {
            NSLog(@"%@",path);
            [fileManager removeItemAtPath:path error:nil];
        }
    }else {
        NSLog(@"你打印的是目录或者不存在");
    }
}

(3)苹果是如何实现autoreleasepool的?

autoreleasepool以一个队列数组的形式实现,主要通过以下三个函数实现:

  • objc_autoreleasepoolPush
  • objc-autoreleasepoolPop
  • objc-autorelease
    看函数名就可以知道,对autoreleasepool分别执行了Push、Pop操作。销毁对象时执行release操作。

(4)objc使用什么机制管理对象的内存?

通过引用计数器(retainCount)的机制来决定对象是否需要释放。每次runloop完成一个循环的时候,都会检查对象的retainCount,如果retainCount为0,说明该对象没有地方需要继续使用了,可以释放掉了。

(5)内存管理的原则

  • 只要还有人在使用这个对象,那么这个对象就不会被回收
  • 只要你想使用这个对象,那么就应该让这个对象的引用计数器加1
  • 当你不想使用这个对象时,应该让对象的引用计数器减1
  • 谁创建,就由谁release
    如果你通过alloc、new、copy来创建一个对象,当你不想用这个对象的时候就必须调用release或者autorelease让引用计数器减1
    不是你创建的就不用你负责release
  • 谁retain,谁release
    只要你调用了retain,无论这个对象如何生成,都需要调用release
  • 总结:有加就应该有减,曾让某个计数器加1,就应该让其在最后减1

(6)UITableView的性能优化,滑动的时候有种卡的感觉是为什么?怎么解决?

  • 在使用第三方应用时,确经常遇到性能上的问题,普遍表现在滚动时比较卡,特别是cell中包含图片的情况时。
  • 实际上针对性地优化一下就可以解决tableView滑动的时候卡顿的问题:

1、 使用不透明视图。不透明的视图可以提高渲染的速度,可以将cell及其子视图的opaque属性设置为YES(默认值)。
2、不要重复创建不必要的cell。UITableView只需要一屏幕的UITableViewCell对象即可。因此在cell不可见时,可以将其缓存起来,而在需要时继续使用它即可。注意:cell被重用时,需要调用setNeedsDisplayInRect:或setNeedsDisplay方法重绘cell。
3、减少动画效果的使用,最好不要使用insertRowAtIndexPaths:withRowAnimation:方法,而是直接调用reloadData方法。
4、减少视图的数目。Cell包含了textLable、detailTextLabel和imageView等view,而你还可以自定义一些视图放在它的contentView里,创建它会消耗较多资源,并且也影响渲染的性能。
5、cell包含图片,且数目较多,使用自定义的cell速度会比使用默认的要快。
6、不需要与用户交互时,使用CALayer,将内容绘制到layer上,然后对cell的contentView.layer调用addSubLayer:方法。
7、不要做多余的绘制工作。在实现drawRect:的时候,它的rect参数就是需要绘制的区域,这个区域之外的不需要进行绘制。
8、预渲染图层。在图形上下文中画,导出成UIImage对象,然后再绘制到屏幕上。(头像圆角,或者其他变形的时候,用图形上下文能提高性能。)异步绘制
9、不要阻塞主线程。tableView在更新数据时,整个界面卡住不动,完全不响应用户请求。常见的是网络请求,等待时间长待数秒。(解决方案:使用多线程,让子线程去执行这些函数或方法)
注意:当下载线程数超过2时,会显著影响主线程的性能。所以在不需要响应用户请求时,下载线程数可以增加到5,不建议再加了,以加快下载速度。如果用户正在交互,应把线程数量控制在2个以内。
10、提前计算并缓存好高度,因为heightForRowAtIndexPath调用非常频繁
11、选择正确的数据结构:学会选择对业务场景最合适的数据结构是写出高效代码的基础。
12、gzip/zip压缩:当从服务端下载相关附件时,可以通过gzip/zip压缩够再下载,使得内存更小,下载速度也更快。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,112评论 29 470
  • iOS 面试题总结(一) 101. 修改下面的代码: typedef enum{ UserSex_Man,User...
    AlaricMurray阅读 1,661评论 0 6
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 1,349评论 0 3
  • iOS面试题(二) 消息发送和转发机制,SEL和IMP 消息发送转载自黄龙辉消息发送和消息转发机制 在Object...
    沧州宁少阅读 206评论 0 0
  • 我的维那师父说:“要知道这个世界我们不知道的太多了。放下身架。谦虚一点。” 突然想起小时候,自己不谦虚,给表妹带来...
    果慧_631e阅读 651评论 3 2