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

【提高】面试四

2016-02-19 17:06 267 查看
1.UIVIew中frame和bounds的区别


bounds是指这个view在它自己坐标系的坐标和大小 而frame指的是这个view在它superview的坐标系的坐标和大小
区别主要在坐标系这一块。

很明显一个是自己为原点的坐标系,一个是以屏幕为原点的坐标系。

frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)

bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
2.layer和view区别

layer是层。在动画中有讲。view是视图,是UI的组成部分。
关系:view是layer的代理。
所有的内容都是通过layer画到view上的。

3.内存管理原则 
alloc,[mutable] copy,retain,那么你必须使用相应的release或autonrelease
谁创建谁释放。
4.NSString *str = [NSData alloc]init编译和运行时分别是什么类型对象
编译时NSString,运行时NSData
5.左连接和右连接
left join right join是sql语法,以左链接为例,是说左侧无论是否被匹配,都会被显示。
6.堆和栈的区别
一、堆栈空间分配区别:
  1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
  2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
  二、堆栈缓存方式区别:
  1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
  2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
  三、堆栈数据结构区别:
  堆(数据结构):堆可以被看成是一棵树,如:堆排序;
  栈(数据结构):一种先进后出的数据结构

7.数组和链表区别
两者都是有序的存储方式,区别在于链表的每个元素都有一个指针指向下一个。
8.代理和通知区别?适用情形
代理 1-1 通知 1-多。
9.MVC 略
10.同步和异步请求区别 略
11.iOS多线程操作 多线程方式 略
12.autoreleasepool的工作原理  
是什么:自动释放池
做什么:为了解决内存管理的问题
为什么(原理) app启动会预先生成一个自动释放池,被声明为autorelease的对象会被放到自动释放池,当自动释放池被销毁,遍历其中元素release掉。
示例如下
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
ClassA *a=[[[ClassA alloc] init] autorelease];
ClassB *b=[[[ClassB alloc] init] autorelease];
ClassC *c=[[[ClassC alloc] init] autorelease];
[pool release];

13oc创建线程的方法?如果在主线程执行代码方法? 略
14.写一个方法 用递归计算n的阶乘 然后存储 略
15.纯代码方式进行自动布局时的主要参数 主要有五个:从哪个到哪个的那个属性有多少的宽度
16.常用的debug工具和内存分析工具 
17.何时使用线程 应该注意什么  在一些需要耗费大量内存的情况下。如下载图片。注意点:循环引用。
18.简单描述iOS如何实现图文混排 
NSAttributedString可以。
然后CoreText也可以。
19.关于userInterationEnabled的属性理解和实现机制 
该属性是判断当前控件是否接收用户响应。
实现机制:
熟悉IOS消息响应链的开发者都了解Hit-Testing的基本过程,此处对此不做深究,我们可以简单的理解为在一次用户的touch交互中,是hit-test决定了Application的整个view层次结构中,到底该由哪个view去接收并处理该事件。其基本的筛选过程可以粗糙的叙述为: 
touch事件发生,创建UIEvent对象
按照Application的view层次结构,逐层调用每个view的hitTest:withEvent:方法,并传入该event对象,view根据hitTest:withEvent:方法和来决定touch点是否包含在自己的bounds中;
如果view的bounds包含了touch点,该view会遍历自己的subview,并调用每个subview的pointInside:withEvent:方法来进一步决定touch事件是发生在自己本身,还是自己的subview上。
重复第二,三步,并筛选出最终接受touch事件的view对象

       我们关注的是筛选过程的第3步,view调用hitTest:withEvent:方法时,会受userInteractionEnabled属性设置的影响,如果当view的该属性值设置为NO时,即使最终touch点确实包含在view的bounds中,该view也会忽略touch事件,当然userInteractionEnabled的设置只是touch筛选的条件之一,在真正的筛选过程中还包含了其他因素的考虑,因此还要参考hitTest:withEvent:的具体方法描述,但以上描述个人感觉足够我们理解userInteractionEnabled属性的基本原理。 

20.oc创建线程的方法 如果主线程中执行代码方法?延时代码? 略
21.iOS自动释放池的理解?ARC模式下如何创建一个自动释放池?(后面不懂)
22.如何给UIImageView同时绑定单击和双击时间?简单描述如何区分?
通用做法:开启用户交互,添加手势
单击和双击:添加手势之后在需要执行的方法中判断点击次数。numberOfTouches.
23.简单实现一个NSRunLoop 理解?

线程与run loop的关系

Run loop,正如其名,loop表示某种循环,和run放在一起就表示一直在运行着的循环。实际上,run loop和线程是紧密相连的,可以这样说run loop是为了线程而生,没有线程,它就没有存在的必要。Run loops是线程的基础架构部分,Cocoa和CoreFundation都提供了run loop对象方便配置和管理线程的run loop(以下都已Cocoa为例)。每个线程,包括程序的主线程(main thread)都有与之相应的run loop对象。

主线程的run loop默认是启动的。

iOS的应用程序里面,程序启动后会有一个如下的main() 函数:

     int main(int argc, char *argv[])

     {

            @autoreleasepool {

              return UIApplicationMain(argc, argv, nil, NSStringFromClass([appDelegate class]));

           }

  }

重点是UIApplicationMain() 函数,这个方法会为main thread 设置一个NSRunLoop 对象,这就解释了本文开始说的为什么我们的应用可以在无人操作的时候休息,需要让它干活的时候又能立马响应。

Bool running = YES;

while(running)

{

//do something

}

24.至少一种常用定义全局变量方法 #define const static等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: