一、知识点整理

217 阅读2分钟

1、 改变view的frame,layer的frame是否会变化?改变layer.frame,view的frame是否会变化?请问原因是什么?

答:都改变了。每个UIView内部都有一个CALayer在提供内容的绘制和显示,并且View的尺寸都是由Layer所提供。一个Layer的frame是由anchorPoint(锚点)、position(位置)、bounds(大小)、transform 共同决定的。而一个View的frame只是简单的返回Layerde的frame。同样的View的center和bounds也是返回Layer的一些属性。 因为view是Layer的代理。

2、 autoreleasepool的释放时机是什么,什么时候需要自己声明一个autoreleasepool。

答:@autoreleasepool是自动释放池,让我们更自由的管理内存。需要自己声明的场景应该是有大量临时变量产生时。避免内存峰值过高,及时的释放内存。

3、 NSDictionary底层的数据结构是什么,根据key找到value的时间复杂度是多少 ?

答:NSDictionary(字典)是使用 hash表来实现key和value之间的映射和存储的, hash函数设计的好坏影响着数据的查找访问效率。数据在hash表中分布的越均匀,其访问效率越高。而在Objective-C中,通常都是利用NSString 来作为键值,其内部使用的hash函数也是通过使用 NSString对象作为键值来保证数据的各个节点在hash表中均匀分布。 O(1)是理想的复杂度,代表着恒定的时间。

4、 求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4](需写明思路,并编程实现)

  • (NSArray *)maxSubArray:(NSArray *)array { NSInteger n = array.count; int max = 0,sum = 0; int beginIndex = 0,endIndex = 0; for(int i =0;i<n;++i){ for(int j=0;j<n;++j){ sum = 0; for(int k=i;k<=j;++k){ sum += [array[k] integerValue]; } if(sum > max){ max = sum; beginIndex = i;endIndex = j; } } } NSMutableArray *maxArray = [NSMutableArray array]; for (int i=beginIndex; i<=endIndex; i++) { [maxArray addObject:array[i]]; } return [maxArray copy]; }

5、 请用效率最高的方式绘制不同颜色的10w个的三角形(请编程实现或实现思路)

答:可采作用UIBezierPath+CAShapeLayer 开启异步并发线程绘制,并回到主线程添加到Layer上。 DrawRect:DrawRect属于UIKit框架,占用CPU,消耗性能大。 CAShapeLayer:CAShapeLayer属于QuartzCore框架,通过GPU来渲染图形,节省性能。动画渲染直接提交给手机GPU,不消耗内存。