iOS开发面试知识点总结

来源:互联网 发布:js定义关联数组 编辑:程序博客网 时间:2024/05/18 06:20

这一段时间都在忙着面试相关的事情,今天面试的时候才发现有些自己以为很熟悉的点在真的去做笔试题和真的机试时都没有做好,也许是从一开始就没有理解清楚,所以现在准备好好的这一段时间遇到的容易在面试出现的问题都整理一下,也是自己成长的一个过程。

1.objective-c的内存管理方式

oc使用对象的引用计数对内存进行管理。OC中每个对象都有一个与之对应的整数,叫“引用计数器”,当一个对象在创建之后它的引用计数器值加1,当调用这个对象的alloc、retain、new、copy方法之后引用计数器值自动在原来的基础上加1,当调用这个对象的release方法之后它的引用计数器值减1,如果一个对象的引用计数器值为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。

2.copy、retain、assign、weak的set方法和含义

strong和retain的语义的set方法一样,会是对象的引用计数增加

    (void)setStongObj:(NSObject *)obj {    [obj retain];    [_obj release];    _obj = obj;    }

weak和assign语义的set方法都是单纯赋值,但是assign针对的是“纯量类型”,weak一般使用的是对象类型,两者的set方法一样,但是weak会在对象遭到摧毁时,属性值会置nil,不会产生野指针,使用比较安全。

  (void)setStongObj:(NSObject *)obj {    _obj = obj;}

copy方法会拷贝一个对象,一般用于nsstring,用于保护属性的封装:

- (void)setName: (NSString*)name{   [_name release];     _name = [name copy];  }

3.delegate和block分别使用什么内存语义,为什么?

比如tableview的delegate,首先其中tableviewController对tableview是拥有关系,设置代理的时候会设置tableview.delegate = self,也就是说此刻的delegate就是tableviewController本身,如果将代理设置为strong或者retain这种拥有关系,那就是说此刻tableview对tableviewController也是拥有关系,就会形成一个引用环,造成内存泄漏,所以必须将delegate设置为非拥有关系。

delegate最重要的是表达非拥有关系,用assign和weak都可以,但是如上文所讲,weak语义的属性会在属性遭到摧毁时,将属性置nil,不会产生野指针,所以推荐使用weak。

block定义的时候,其所占的内存是分配在栈上的,也就是说block只在定义的那部分区域有效,所以要是使用copy将block拷贝,从栈上拷贝到堆上。

4.oc的运行时特征具体指的是什么?有什么应用?

在oc中,runtime是一套底层的C语言API,所编写的OC代码都会在程序运行过程中转化为runtime的C语言代码。OC的运行机制是说在程序运行时才会去确定对象的类型和对象所要调用的方法。
利用OC的运行时特征,可以动态的给类增加和修改属性和方法。

5.类别和扩展是什么?有什么区别?

类别也叫分类,就是把一个类按照特征类型分成几个部分,写在一个文件或者分开写在不同的文件,或者用来给不知道的源码的类添加方法。类别中的方法优先级高于原来的类,两个类别中相同的方法优先级按照后编译的顺序。类别不能直接添加属性,但可以通过运行时特征绑定关联对象添加属性。

扩展也叫作匿名分类,可以添加属性,隐藏类的实现细节。

6.oc有多继承吗?使用什么代替?cocoa框架所有的类都是继承NSObject的吗?

OC不支持多继承,可以使用协议来实现,基本所有的都是继承于NSObject,但是有一个类比较例外,因为用的比较少所以会被忽略,就是NSProxy。

7.深拷贝和浅拷贝的区别

简单来讲,浅拷贝是拷贝对象地址,即新建一个指针但是指针指向的还是原来的那一片内存空间,所以拷贝的和被拷贝的两个指向的都是同一个对象。

深拷贝会将对象整个拷贝,形成一个和原对象一样的对象,但是保存在一个新地址,拷贝的和被拷贝的两个虽然对象是一样的但是是两个不同的内存地址。

以上都是很常见的,别的在慢慢补,有错误疏漏的地方欢迎指出~

0 0
原创粉丝点击