iOS 面试总结

1.   Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?

OC的类不可以多继承,可以实现多个接口,通过实现多个接口可以完成C++的多重继承,Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。


2.类别的作用?继承和类别在实现中有何区别?

Category可以不再获悉,不改变原来代码的情况下往里面添加新的方法,只能添加不能不能删除、修改,并且如果和原来类别中的方法名称冲突,则覆盖原来的方法(类别具有更高的优先级)

作用:1)将类的实现分散到多个不同的文件或多个不同的框架中

   2)创建对私有方法的前向引用

   3)对象添加非正式协议

继承可以添加、修改或者删除方法并且可以增加属性。


3.浅复制和深复制的区别

浅复制:只复制指向对象的指针而不复制引用对象本身

深复制:复制引用对象本身


4.类别和类扩展的区别

类别和extensions的不同在于后者可以添加属性,另外后者添加的方法必须要实现,后者可以认为是一个私有的类别


5.何为kvo和kvc?(观察者模式)

kvc:键值编码是一种间接访问对象的属性,使用字符串来标示属性,而不是通过存取的方法,直接通过实例变量访问的机制。

eg:[self setValue:page forKeyPath:@"page"];

kvo:键值观察机制,他提供了观察某一属性变花的方法,极大的简化了代码

eg:

      [request addObserver:self forKeyPath:@"page" options:

     (NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOldcontext:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

    if ([keyPath isEqual:@"page"])

    {

            trackProgress.progress=[[change objectForKey:NSKeyValueChangeNewKey]intValue]/[_bookDown.pagetotal floatValue];

   }

}


6.代理的作用

代理的作用目的是改变或者传递控制链。允许一个类在某些特定时刻通知到其他的类,而不需要获取某些类的指针,减少框架复杂度,

对于代理使用assign(简单的赋值)[对于retain,copy除了赋值还会增加一次引用次数,对于delegate如果使用了retain那么就会形成相互拥有一个引用计数的局面,都不能正常释放,陷入死锁状态。


7.oc中可修饰和不可修饰的类

可和不修饰可修饰的集合类,这个我个人简单的理解就是可动态添加修改和不可动态添加修改,比如:NSArray和NSMUtableArray前者在初始化后的内存就是固定不变的后者可以添加动态,可动态申请新的内存空间。


8.#import和#include有什么区别,#import<>和#import“”又有什么区别 @class

import是oc导入的头文件的关键字#include是c/C++导入的关键字,#import会自动的导入一次,不会重复导入,不会引起交叉编译。

@class告诉编译器某个类的声明,当执行时才去看某类的执行文件,当两个类文件有循环依赖关系需要用class,在interface中引入一个类就用@class,它会把这个类作为一个类型来使用,而在实现这个inteface的文件中如果需要引用这个类的实体变量或者方法还是需要#import在@才class中声明的类。

#import<>引用系统文件,它用于系统自带的头文件的引用,编译器会在系统文件目录下查找改文件

#import“”用户自定义的文件用双引号引用,编译器首先会在用户目录下查找然后到安装目录下查找


9.类变量的@protected @private @public 

@protected该类和所有子类中的方法可以直接访问这样的变量(默认)

@private该类中的方法可访问这样的变量,子类不可以

@public除了自己和子类,也可被其他类或者其他模块中的方法访问


10.id声明的对象有什么特性

id声明的对象具有运行时的特性,即可以指向任何类型的oc对象。


11.对于NSString * str=[[NSData alloc]init]str分别在编译时和运行时是什么类型的对象?

编译时是NSString  运行时是NSData


12.为什么有些5.0独有的oc函数在4.0上运行会报错,而5.0独有的类在4.0上分配内存抱错,分配的结果是什么?

运行时是因为4.0的sdk里没有对应的函数实现所以会找不到对应的@selector指针,错误而分配内存,应该是涉及到类的创建的机制上


13.auomic(原子操作)是oc使用的一种线程保护技术,防止在未完成的时候被另一线程读取,造成数据错误(耗费系统资源)

如果没有使用多线程间的通信编程那么用nonatomic



14.const 

欲阻止一个变量被改变,可以使用 const 关键字。在定义该const 变量时,通常需要对它进行初
始化,因为以后就没有机会再去改变它了;
(1)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为 const,或二者同时指
定为const;
(2)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(3)对于类的成员函数,若指定其为const 类型,则表明其是一个常函数,不能修改类的成员变量;
(4)对于类的成员函数,有时候必须指定其返回值为const 类型,以使得其返回值不为“左值”。


15.线程和进程的区别?

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值