标签:
面试总结(一)
1.UIWindow和UIView和 CALayer 的联系和区别?
UIwindow是UIView的子类,UIWindow的主要作用:一是提供一个区域来显示UIView,二是将事件(event)的分发给UIView,一个应用基本上只有一个UIWindow.
万物归根,UIView和CALayer都是的老祖都是NSObjet。可见 UIResponder是用来响应事件的,也就是UIView可以响应用户事件。
CALayer 和 UIView 的区别:
1.1 UIView的继承结构为: UIResponder : NSObject。
1.2
所属框架,UIView是在
/System/Library/Frameworks/UIKit.framework中定义的,UIKit主要是用来构建用户界面,并且是可以响应事
件的。CALayer是在/System/Library/Frameworks/QuartzCore.framework定义的。而且CALayer
作为一个低级的,可以承载绘制内容的底层对象出现在该框架中。
1.3 UIView相比CALayer最大区别是UIView可以响应用户事件,而CALayer不可以。UIView侧重于对显示内容的管理,CALayer侧重于对内容的绘制。UIView是基于CALayer的高层封装。
1.4 相似支持
总结一下就是:UIView是用来显示内容的,可以处理用户事件.CALayer是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件
为
啥有两套体系
并不是两套体系?UIView和CALayer是相互依赖的关系。UIView依赖与calayer提供的内容,CALayer依赖uivew提供的容器
来显示绘制的内容。归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的
CALayer实现,添加了响应事件的能力。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如
frame,bounds等等,实际上内部都是在访问它所包含的CALayer的相关属性。
UIView的layer树形在系统内部,被系统维护着三份copy(这段理解有点吃不准)。
这三棵树的逻辑结构都是一样的,区别只有各自的属性。
UIView的主layer以外,对它的subLayer,也就是子layer的属性进行更改,系统将自动进行动画生成。
CALayer
的坐标系系统和UIView有点不一样,它多了一个叫anchorPoint的属性,它使用CGPoint结构,但是值域是0~1,也就是按照比例来设
置。这个点是各种图形变换的坐标原点,同时会更改layer的position的位置,它的缺省值是{0.5, 0.5},也就是在layer的中央。
哈哈,这下够说一壶的了把,虽然说完感觉其实没什么卵用,但是记住一定要说的绘声绘色。
2. property 都有哪些常见的字段
3. strong,weak,retain,assign,copy nomatic 等的区别。
weak 和strong的区别:weak和strong不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。
copy与retain:
4.__block和__weak修饰符的区别:
5.常见的 Http 状态码有哪些?
6.单例的写法。在单例中使用数组要注意什么?
1 static PGSingleton *sharedSingleton; 2 + (instancetype)sharedSingleton 3 { 4 static dispatch_once_t onceToken; 5 dispatch_once(&onceToken, ^{ 6 sharedSingleton = [[PGSingleton alloc] init]; 7 }); 8 return sharedSingleton; 9 }
其实上面的还不是标准的单例方法,标准的单例方法需要重写 copyWithZone,allocWithZone,init,确保以任何方式创建出来的对象只有一个,这里就不详细写了。
单
例使用 NSMutableArray
的时候,防止多个地方对它同时遍历和修改的话,需要加原子属性。并且property用strong,并且写一个遍历和修改的方法。加上锁.
Lock,UnLock.(PS:考虑性能问题尽量避免使用锁,在苹果的文档张看到的不要问我为什么,我也忘了自己查去。。)
7.static 关键字的作用
8.iOS 中的事件的传递:响应链
简要说一下:
9.堆和栈的区别
申请大小:
栈:
在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在
WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因
此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
标签:
原文地址:http://www.cnblogs.com/iCocos/p/4782555.html