您的位置:首页 > 职场人生

iOS面试题二

2016-03-11 10:31 429 查看
一、写一个NSString类的实现:
+ (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
+ (id) stringWithCString: (c*****t char*)nullTerminatedCString
encoding: (NSStringEncoding)encoding
{
NSString *obj;
obj = [self allocWithZone: NSDefaultMallocZone()];
obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
return AUTORELEASE(obj);
}

二、static 关键字的作用: 
(1)函数体内 static 变量的作用范围为该函数体,不同于 auto变量,该变量的内存只被分配一次, 
因此其值在下次调用时仍维持上次的值; 
(2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; 
(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明 
它的模块内; 
(4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; 
(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this指针,因而只能访问类的static
成员变量。

三、线程与进程的区别和联系
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。 
程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

四、__block和__weak的区别:
__block和__weak修饰符的区别其实是挺明显的: 
1、__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。 

2、__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。 

3、__block对象可以在block中被重新赋值,__weak不可以。 

五、单利里面添加 NSMutableArray 的时候,防止多个地方对它同时便利和修改的话,需要加原子属性。并且用strong,,,并且写一个遍历和修改的方法。加上锁。   Lock   UnLock    
 
    __weak ViewController*  weakSelf = self;
GCD里面用 __weak 防止内存释放不了,循环引用。

六、UIButton 的父类是UIControl  UIControl的父类是UIView UIView的父类是 UIResponder
 
七、http状态码 :
302 是请求重定向。
500以上是服务器错误。
400以上是请求链接错误或者找不到服务器。
200以上是正确。
100以上是请求接受成功。

八、readwritereadonlyassignretaincopynonatomic属性的作用 
@property是一个属性访问声明,扩号内支持以下几个属性: 
1、getter=getterName,setter=setterName,设置setter与getter的方法名 
2、readwrite,readonly,设置可供访问级别 
2、assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题 
3、retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料) 
4、copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。 
copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。
5、nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。
6、atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。

九、什么时候用delegate,什么时候用Notification:
delegate针对one-to-one关系,并且reciever可以返回值给sender,
notification 可以针对one-to-one/many/none,reciever无法返回值给sender.
所以,delegate用于sender希望接受到 reciever的某个功能反馈值;
notification用于通知多个object某个事件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: