iOS 面试题

161 阅读4分钟

1、#import和#include的区别,@class代表什么?

#ifndef __HYB__GRIDVIEWCONTROLLER__

#define kScreenWidth ...

#endif

@class是类前向声明的指令,相当于告诉编译器有这样一个类,但是类的定义在后面提供。在编译时期,编译器看到@class指令声明了对应的类型,是可以正常编译过的。这是很常用的指令,主要是防止循环引用。

如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。

2、谈谈Objective-C的内存管理方式及过程

参考答案:对于Objective-C 在MRC下内存是手动管理的,而在ARC下,我们不用手动去添加retain/release,但是其内存管理法则是一致的。

内存管理黄金法则:谁使对象的引用计数+1,谁就负责管理使该对象的引用计数-1;

说说内存管理: 在MRC下,对于需要手动释放的对象的内存管理,我们通过release使用对象引用计数-1,若其引用计数变成0,则对象会被立即释放掉。对于autorelease交给自动释放池管理的对象,每个runLoop循环结束就会去自动释放池中使用所有autorelease类型对象的引用计数-1,若变成0,则释放掉。

在ARC 下,我们没有不能直接调用reatin/release来管理释放,都是交给自动释放池来管理的。因此,若创建临时变量,想要使用完就释放掉,需要在临时变量防盗新创建的自动释放池里,这样就可以使用完后就达到了自动释放池的一个循环,就会使对象引用计数减一, 变成0后释放。

最后,对于交给自动释放池管理的对象,实在每个run loop事件循环结束时才会去使对象引用计数减一,此时引用计数为0时才会得到释放。

3、Objective-C有私有方法吗?私有变量呢?

在Objective-C中,没有实实在在的私有方法。通常所谓的私有方法就是放在.m文件中声明和实现,外部不能直接看到而已,但是若我们知道有这么一个API,我们是可以调用的。比如,苹果上架会因为使用了苹果的所谓的私有API而会被拒,而这个所谓的私有的API就是指苹果没有公布出来,但是我们可以通过其他方式可以看到苹果内部有这样一个API可以实现某些不公开的功能。

私有变量是有的,可以通过@private来声明私有变量。

如果我们没有使用@private声明,它是受保护的外部也不能直接通过对象给变量赋值。

4、Objective-C有多继承吗?没有的话用什么代替?Cocoa中所有的类都是NSObject的子类?

Objective-C没有多继承,这是去掉C++中多继承的特性,改成使用protocol来代替。Cocoa中所有的类都是NSObject的子类,这是正确的。如果学习过runtime,应该知道根类是NSOjbect,它元类的isa指针指向的是NSObject。

5、浅拷贝与深拷贝的区别是什么

浅拷贝并不拷贝对象本身而仅仅拷贝指向对象的指针;深拷贝就是内容拷贝,有新的内存地址。

6、属性readwrite、readonly、assign、retain、copy、nonatomic各是什么作用,在哪种情况下用?

作用分别是:

readwrite:代表可读可写,会生成getter和setter方法。 使用:默认使用。

readonly:代表只读,只生成getter方法,不会生成setter方法。 当不希望生成setter方法时使用。

assign:代表普通赋值,通常用于非对象类型。

retain:MRC下才能手动使用,与ARC下的strong一样,指定强引用引用计数+1.MRC下才能使用,表示对象强引用。

copy:代表拷贝,也是强引用,引用计数+1。进行指针拷贝;生成不可变对象,需要拷贝时使用。

nonatomic:代表非原子操作,非线程安全,但可以提高性能。

7、常见的objective-c的数据类型有哪些,和C的基本数据类型有什么区别?

常见数据类型:NSData、NSArray、NSDictionary、NSSet、NSCountedSet、NSNumber、NSInteger、NSUInteger、所有基本C数据类型,当然还有对应可变的类型。

有什么区别:对象类型在C中全没有。然后基本类型是所有的C的基本类型,当然oc还提供了NSNumber这个类来处理所有的基本C类型。

9、什么时候使用NSMutableArray,什么时候使用NSArray?

参考答案:

原则上对外返回的数据都应该是NSArray类型,防止外部操作内容的数据,提供只读不可写的操作。NSMutableArray与NSArray的区别在于,前者是可以有增、删、改操作的,但是后者在初始化之后就只有读操作。如果不要求增、删、改操作,原则上直接使用NSArray即可;反之都使用NSMutableArray。