面试题
1.Object-C有多继承吗?没有的话用什么代替?
cocoa中所有的类都是NSObject的子类,多继承在这里是用protocol委托代理来实现的
你不用去考虑繁琐的多继承,虚基类的概念,
ood的多态性 在obj-c中通过委托来实现。
2.Object-C有私有方法吗?私有变量呢?
objective-c类里面的方法只有两种,静态方法和实例方法,这似乎就不是完整的面向对象了,按照oo的原则就是一个对象只暴露有用的东西,如果没有了私有方法的话,对于一些小范围的代码重用就不那么顺手了,在类里面声明一个私有方法
@interface Controller :NSObject{NSString *something;}
+(void)thisIsAStaticMethod;
-(void)thisIsAnInstanceMethod;
@end
@interface Controller(private)-
(void)thisIsAPrivateMethod;
@end
@private可以用来修饰私有变量
在Objective-C中,所有实例变量默认都是私有的,所有实例方法默认都是共有的
3.关键字const什么含义
const int a;
int const a;
const int *a;
int *const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是可以修改的,同时指针也是不可修改的)。
结论:
1.关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉用户这个参数的应用目的。如果你曾花很长时间来清理别人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下垃圾让别人来清理的)
2.通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3.合理的使用关键字const 可以使编译器很自认地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
想阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通过需要对它进行初始化,因为以后就没有机会再去改变它了;
2,对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
3,在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
4,对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
5,对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
!6.#import和#include的区别,@class代表什么?
@class一般用于文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import
而#import比起#include的好处就是不会引起重复编译
!!!7.线程和进程的区别?
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在
保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,
但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健
壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操
作,只能用线程,不能用进程。
8.堆和栈的区别?
管理方式:对于栈来讲,是由编译器自动管理,无需我们手动控制;对于堆来说,释放工作由程序员控制,ios7以后用ARC系统自动管理内存,不需要我们来管理
申请大小:
栈:在mac下,栈时向低地址扩展的数据结构,是一块连续的内存的区域。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空间内存地址的,自
然是不连续的,而链表的遍历方向时由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可
见,堆获得的空间比较灵活,也比较大。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降
低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可
能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译
器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,它的动态
分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压
栈出栈都有专门的指令执行,这就决定了栈的效率比较高,
9.Object-C的内存管理?
ios7以后用ARC系统自动管理内存,不需要我们来管理内存
ios7之前
1.当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1。当你不再使用该对象时,你要负责
向该对象发送一条release或autorelease消息,这样该对象将在使用寿命结束时被销毁。
2.当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器为1,而且已经被设置为自动释放,你不需要
执行任何操作来确保该对象被清理,如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它
3.如果你保留了某个对象,你需要(最终)释放或自动释放该对象,必须保持retain方法和release方法的使用次数相等