1、NSRunLoop
- Runloop的作用在于当有事情要做时它使当前的thread工作,没有事情做时又使thread 休眠sleep。Runloop并不是由系统自动控制的,尤其是对那些新建的次线程需要对其进行显示的控制。
- 有3类对象可以被run loop监控:
sources
、timers
、observers
。当这些对象需要处理的时候,为了接收回调,首先必须通过CFRunLoopAddSource
,CFRunLoopAddTimer
或者CFRunLoopAddObserver
把这些对象放入run loop。 要停止接收它的回调,可以通过CFRunLoopRemoveSource
从run loop中移除某个对象。 - 每一个线程都有自己的runloop, 主线程是默认开启的,创建的子线程要手动开启,因为
NSApplication
只启动main applicaiton thread
。 - NSTimer默认添加到当前NSRunLoop中,也可以手动制定添加到自己新建的NSRunLoop的中。
2、为什么说OC是runtime language
?
- 将数据类型的确定有编译时,推迟到了运行时
- 运行时机制使我们直到运行时才去决定一个对象的类型,以及调用改了别对象指定方法
- 多态是指不同对象以自己的方式响应相同的消息的能力
3、平铺模式是指内容组织上内有层次关系,展示的内容都放在一个主屏幕上,采用分屏或分页控制器进行导航,可以左右或上下滑动屏幕查看内容,设计控件:UIPageControl
和UIScrollView
.
4、delegate中的property
使用assign
属性的原因?
避免循环引用,例如,tableview中,viewController对象持有tableview,如果tableview不适用assign,会造成tableview也持有viewController,即相互持有,结果是viewController内存泄漏,释放不掉。
5、NSXMLParser
构造方法有哪些?
查api知道有3个:
initWithContentOfURL
、initWithData
、initWithStream
也就是本地xml
文件的解析必须转化为NSData
查api知道json
初始化方法:
JSONObjectWithData
、JSONObjectWithStream
解析json用dataWithJSONObject
、writeJSONObject toStream
6、**static **关键字的作用
- 函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,
因此其值在下次调用时仍维持上次的值; - 在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
- 在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明
它的模块内; - 在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
- 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。
7、线程与进程的区别和联系
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
8、堆和栈的区别
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
申请大小:
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
网友评论