iOS面试题二

来源:互联网 发布:淘宝新店扶植期 编辑:程序博客网 时间:2024/06/01 10:46


一、写一个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是一个属性访问声明,扩号内支持以下几个属性: 

1getter=getterNamesetter=setterName,设置settergetter的方法名 

2readwrite,readonly,设置可供访问级别 

2assignsetter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题 

3retainsetter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料

4copysetter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount1。这是为了减少对上下文的依赖而引入的机制。 

copy是在你不希望ab共享一块内存时会使用到。ab各自有自己的内存。

5nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)

6atomicnonatomic用来决定编译器生成的gettersetter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。


九、什么时候用delegate,什么时候用Notification

delegate针对one-to-one关系,并且reciever可以返回值sender

notification 可以针对one-to-one/many/none,reciever无法返回值给sender.

所以,delegate用于sender希望接受到 reciever的某个功能反馈值;

notification用于通知多个object某个事件。

0 0
原创粉丝点击