面试题总结

1.#include、@class 、#import区别

使用#include引入同一个类2次的时候编译器会报错:因为#include相当于拷贝头文件中的声明内容,会报重复定义的错误(Duplicate interface definition for class ‘xx’);但是#import解决了重复导入报错的问题!

#import会链入该头文件的全部信息,包括该类的属性、方法等;而@class只是告诉编译器,其后面声明的名称是类的名称,不会引入该类的属性等等信息。在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。

在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用 @class则不会。

如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会 有编译错误出现。所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.

2.Object-C有多继承吗?没有的话用什么代替?

OC中没有多继承。一般使用协议 Protocol 来实现的。

3.简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?
OC使用了一种叫做引用计数的机制来管理对象,如果对一个对象使用了alloc、[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease。也可以理解为自己生成的对象,自己持有。非自己生成的对象,自己也能持有。不在需要自己持有的对象时释放。非自己持有的对象无法释放。生成并持有对象<alloc,new,copy,mutableCopy等>,持有对象<retain>,释放对象<release>,废弃对象<dealloc>。readwrite(默认):可读可写,表示既有getter方法,也有setter方法。readonly:表示只有getter方法,没有setter方法。nonatomic:不考虑线程安全。atomic(默认):线程操作安全。strong(默认):ARC下和MRC下retain一样,weak(ARC下):和(MRC下)assign类似,区别是当weak指向的内存释放掉后自动置为nil,防止野指针。

unsafe_unretained声明一个若引用,但不会自动置为nil,可能会出现野指针。

 1 // 线程安全下的setter和getter方法:
 2 - (NSString *)value{
 3     @synchronized (self) {
 4         return [[_value retain] autorelease];
 5     }
 6 }
 7 
 8 - (void)setValue:(NSString *)aValue{
 9     @synchronized(self){
10         [aValue retain];
11         [_value release];
12         _value = aValue;
13     }
14 }

3.类变量的@protected ,@private,@public,@package,声明各有什么含义?
表明类成员的作用域不同:

@private作用范围只能在自身类(外界既不可访问,又不能继承;

@protected作用范围在自身类和子类,如果什么都不加修饰,默认是@protected(外界不可访问,但是可以继承);

@public作用范围最大,可以在任何地方被访问(外界即可访问,又可以继承);

@package作用范围在某个框架内

4.线程是什么?进程是什么?二者有什么区别和联系?
线程是CPU独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段),进程是资源分配的基本单位(进程是一块包含了某些资源的内存区域)。进程是线程的容器,真正完成代码执行的是线程,而进程则作为线程的执行环境。一个程序至少包含一个进程,一个进程至少包含一个线程,一个进程中的多个线程共享当前进程所拥有的资源。

可参考:线程和进程详解

5.深拷贝和浅拷贝

6.控制器生命周期

后续持续更新!

 

尊重作者劳动成果,转载请注明: 【kingdev】

posted @ 2016-03-21 09:28  Kingdev  阅读(153)  评论(0编辑  收藏  举报