IOS试题收集1
1、Objective C中有多继承吗?没有的话用什么代替?
Protocol
2、Objective C中有私有方法吗?私有变量呢?
OC类里面只有静态方法和实例方法这两种,@private可以用来修饰私有变量,所有实例方法默认都是公有的,如果想要可以达到私有效果的方法可以不把方法的声明放在@interface...@end
3、关键字const的含义是什么?
const int a;
int const a;
coust int *a;
int *const a;
int const *a const;
解释:前两个一样,都为整形常量;第三个为指针指向不变的整形常量,即指针可变,整形常量不可变;第四个为指向可变的整形变量的常量指针,即整形变量可变,指针不会变;第五个为常指针指向整形常量;
4、关键字volatile的含义是什么?
5、关键字static
C++和Objective C中的static
4、#import和#include的区别,@class代表什么?
#import不会引起重复包含
5、线程和进程的区别
进程和线程都是由操作系统所体会的程序运行的基本 单元,系统利用该基本单元实现系统对应用的并发性。 进程和线程的主要差别在于它们是不同的操作系统资 源管理方式。进程有独立的地址空间,一个进程崩溃 后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程
6、堆和栈的区别
管理方式:对于栈来讲,是由编译器自动管理,无需 我们手工控制;对于堆来说,释放工作由程序员控制, 容易产生memory leak。
申请大小:
栈:在Windows下,栈是向低地址扩展的数据结构,是
一块连续的内存的区域。这句话的意思是栈顶的地址
和栈的最大容量是系统预先规定好的,在WINDOWS
下,栈的大小是2M(也有的说是1M,总之是一个编
译时就确定的常数),如果申请的空间超过栈的剩余
空间时,将提示overflow。因此,能从栈获得的空间
较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存
区域。这是由于系统是用链表来存储的空闲内存地址
的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟
内存。由此可见,堆获得的空间比较灵活,也比较大。
碎片问题:对于堆来讲,频繁的new/delete势必会造
成内存空间的不连续,从而造成大量的碎片,使程序
效率降低。对于栈来讲,则不会存在这个问题,因为
栈是先进后出的队列,他们是如此的一一对应,以至
于永远都不可能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配
是编译器完成的,比如局部变量的分配。动态分配由
alloca函数进行分配,但是栈的动态分配和堆是不同
的,他的动态分配是由编译器进行释放,无需我们手
工实现。
分配效率:栈是机器系统提供的数据结构,计算机会
在底层对栈提供支持:分配专门的寄存器存放栈的地
址,压栈出栈都有专门的指令执行,这就决定了栈的
效率比较高。堆则是C/C++函数库提供的,它的机制
是很复杂的。
7、Objective C的内存管理机制
8、IOS有没有垃圾回收
9、UITableView的重用机制
UITableView头文件,会找到NSMutableArray* visiableCells和NSMutableDictnery* reusableTableCells两个结构。visiableCells内保存当前显示的cells,reusableTableCells保存可重用的cells
10、ViewController的loadView、viewDidLoad、viewDidUnload分别什么时候调用的,在自定义ViewController时在几个函数中应该做什么工作?
init方法
在init方法中实例化必要的对象(遵从LazyLoad思想) init方法中初始化ViewController本身
loadView方法
当view需要被展示而它却是nil时,viewController会调
用该方法。不要直接调用该方法。
如果手工维护views,必须重载重写该方法
如果使用IB维护views,必须不能重载重写该方法
loadView和IB构建view
你在控制器中实现了loadView方法,那么你可能会在
应用运行的某个时候被内存管理控制调用。
如果设备内存不足的时候, view 控制器会收到
didReceiveMemoryWarning的消息。
默认的实现是检查当前控制器的view是否在使用。
如果它的view不在当前正在使用的view hierarchy里
面,且你的控制器实现了loadView方法,那么这个
view将被release, loadView方法将被再次调用来创建
一个新的view。
viewDidLoad方法
viewDidLoad 此方法只有当view从nib文件初始化的
时候才被调用。
重载重写该方法以进一步定制view在iPhone OS 3.0及之后的版本中,还应该重载重写
viewDidUnload来释放对view的任何索引
viewDidLoad后调用数据ModelviewDidUnload方法
当系统内存吃紧的时候会调用该方法(注:
viewController没有被dealloc)
内存吃紧时,在iPhone OS 3.0之前
didReceiveMemoryWarning
是释放无用内存的唯一
方式,但是OS 3.0及以后viewDidUnload方法是更好
的方式
在该方法中将所有IBOutlet(无论是property还是实例
变量)置为nil(系统release view时已经将其release
掉了)
在该方法中释放其他与view有关的对象、其他在运行
时创建(但非系统必须)的对象、在viewDidLoad中
被创建的对象、缓存数据等 release对象后,将对象
置为nil(IBOutlet只需要将其置为nil,系统release
view时已经将其release掉了)
一般认为viewDidUnload是viewDidLoad的镜像,因为
当view被重新请求时,viewDidLoad还会重新被执行
viewDidUnload中被release的对象必须是很容易被重
新创建的对象(比如在viewDidLoad或其他方法中创建的对象),不要release用户数据或其他很难被重新
创建的对象dealloc方法
viewDidUnload和dealloc方法没有关联,dealloc还是
继续做它该做的事情
ViewController的didReceiveMemoryWarning是在什
么时候调用的?默认的操作是什么?
当程序接到内存警告时View Controller将会收到这个
消息:didReceiveMemoryWarning
从iOS3.0开始,不需要重载这个函数,把释放内存的
代码放到viewDidUnload中去。
这个函数的默认实现是:检查controller是否可以安全
地释放它的view(这里加粗的view指的是controller的
view属性),比如view本身没有superview并且可以被
很容易地重建(从nib或者loadView函数)。
如果view可以被释放,那么这个函数释放view并调用
viewDidUnload。
你可以重载这个函数来释放controller中使用的其他
内存。但要记得调用这个函数的super实现来允许父类
(一般是UIVIewController)释放view。
如果你的ViewController保存着view的子view的引用,
那么,在早期的iOS版本中,你应该在这个函数中来释放这些引用。而在iOS3.0或更高版本中,你应该在
viewDidUnload中释放这些引用
11、怎么理解MVC,在Cocoa中MVC是怎么实现的?
12、delegate和notification区别,分别在什么情况下使用?
13、KVC(Key-Value-Coding)
KVO(Key-Value-Observing)
理解KVC与KVO(键-值-编码与键-值-监看)
14、self.跟self什么区别?id、nil代表什么?
15、Category和Protocol
16、iOS程序运行流程
1. 系统调用app的main函数
2. main函数调用UIApplicationMain.
3. UIApplicationMain创建shared application
instance, UIApplication默认的instance.
4. UIApplicationMain读取Info.plist找到主nib文件, 加
载nib,把shared application instance 设为nib的
owner.