ios面试题

上传人:206****923 文档编号:91041808 上传时间:2019-06-21 格式:DOC 页数:37 大小:26.21KB
返回 下载 相关 举报
ios面试题_第1页
第1页 / 共37页
ios面试题_第2页
第2页 / 共37页
ios面试题_第3页
第3页 / 共37页
ios面试题_第4页
第4页 / 共37页
ios面试题_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《ios面试题》由会员分享,可在线阅读,更多相关《ios面试题(37页珍藏版)》请在金锄头文库上搜索。

1、ios面试题 1.为什么说Objective-C是一门动态的语言?1.object-c类的类型和数据变量的类型都是在运行是确定的,而不是在编译时确定。例如:多态特性,我们可以使用父类指针来指向子类对象,并且可以用来调用子类的方法。运行时(runtime)特性,我们可以动态的添加方法,或者替换方法。2.讲一下MVC和MVVM,MVP?MVC:简单来说就是,逻辑、试图、数据进行分层,实现解耦。MVVM:是Model-View-ViewMode模式的简称。由视图(View)、视图模型(ViewModel)、模型(Model)三部分组成.比MVC更加释放控制器臃肿,将一部分逻辑(耗时,公共方法,网络请

2、求等)和数据的处理等操作从控制器里面搬运到ViewModel中MVVM的特点:低耦合。View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。可重用性。可以把一些视图的逻辑放在ViewModel里面,让很多View重用这段视图逻辑。独立开发。开发人员可以专注与业务逻辑和数据的开发(ViewModel)。设计人员可以专注于界面(View)的设计。可测试性。可以针对ViewModel来对界面(View)进行测试MVP:本小编没有接触,希望可以得到大家的帮助。可以在下面留言。3.为什么

3、代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?代理是使用weak来修饰的。1.使用weak是为了避免循环引用。2.当使用weak修饰的属性,当对象释放的时候,系统会对属性赋值nil,object-c有个特性就是对nil对象发送消息也就是调用方法,不会cash。delegate:传递的是事件(even),代理可以让A对象通知B对象,我(A)发生的变化,前提B遵循了A的代理,并且实现了A的代理方法。dataSource: 传递的是数据。如果A对象声明了数据源,当我们创建A对象的时候,我们就该实现数据源,来告诉A,他所需要的一些数据。例如:tabl

4、eView数据源方法,需要告诉它,我要实现几组cell,每组cell多少行cell,实现的cell什么样式,什么内容同样delegate和 dataSource,都是可以使用require和optional来修饰的。代理和Block的区别相同点:代理和Block大多是我们都可以用来做倒序传值的。我们都得注意避免循环引用。不然我们去使用代理还是Block的时候,都需要判断它们是否实现不同点:代理使用weak修饰,代理必须先声明方法。当我们调用代理的时候要判断是否已经实现。block:使用的是copy来修饰,block保存的是一段代码,其实也就是一个函数。并且可以自动捕捉自动变量,如果想修改此自动

5、变量,还必须使用_block修饰。4.属性的实质是什么?包括哪几个部分?属性默认的关键字都有哪些?dynamic关键字和synthesize关键字是用来做什么的?属性是描述类的特征,也就是具备什么特性。三个部分,带下划线的成员变量,get、setter方法。默认关键字:readwrite,assign, atomic; - 是针对基本类型(NSInteger, BOOL, NSUInteger, int, 等)但是针对引用类型, 默认:strong, readwrite, atomic (例如:NSString, NSArray, NSDictory等)dynamic :修饰的属性,其gett

6、er和setter方法编译器是不会自动帮你生成。必须自己是实现的。synthesize:修饰的属性,其getter和setter方法编译器是会自动帮你生成,不必自己实现。且指定与属性相对应的成员变量。5.属性的默认关键字是什么?默认关键字,基本数据: atomic,readwrite,assign普通的 OC 对象: atomic,readwrite,strong6.NSString为什么要用copy关键字,如果用strong会有什么问题?(注意:这里没有说用strong就一定不行。使用copy和strong是看情况而定的众所周知,我们知道,可变类型(NSMutableArray,NSMuta

7、bleString等)是不可边类型(NSString,NSArray等)的子类,因为多态的原因,我们可以使用不可边类型去接受可变类型。1.当我们使用strong修饰A不可边类型的时候,并且使用B可变类型给A赋值,再去修改可变类型B值的时候,A所指向的值也会发生改变。引文strong只是让创建的对象引用计数器+1,并返回当前对象的内容地址,当我们修改B指向的内容的时候,A指向的内容也同样发生了改变,因为他们指向的内存地址是相同的,是一份内容。2.当我们使用copy修饰A不可边类型的时候,并且使用B可变类型给A赋值,再去修改可变类型B值的时候,A所指向的值不会发生改变。因为当时用copy的修饰的时

8、候,会拷贝一份内容出来,并且返回指针给A,当我们修改B指向的内容的时候,A指向的内容是没有发生改变的。因为A指向的内存地址和B指向的内存地址是不相同的,是两份内容3.copy修饰不可边类型(NSString,NSArray等)的时候,且使用不可边类型进行赋值,表示浅拷贝,只拷贝一份指针,和strong修饰一样,当修饰的是可变类型(NSMutableArray,NSMutableString等)的时候,且使用可边类型进行赋值,表示深拷贝,直接拷贝新一份内容,到内存中。表示两份内容。image.png7.如何令自己所写的对象具有拷贝功能?如果想让自己的类具备copy方法,并返回不可边类型,必须遵循

9、nscopying协议,并且实现- (id)copyWithZone:(NSZone *)zone如果让自己的类具备mutableCopy方法,并且放回可变类型,必须遵守NSMutableCopying,并实现- (id)mutableCopyWithZone:(nullable NSZone *)zone注意:再此说的copy对应不可边类型和mutableCopy对应不可边类型方法,都是遵从系统规则而已。如果你想实现自己的规则,也是可以的。8.可变集合类 和 不可变集合类的 copy 和 mutablecopy有什么区别?如果是集合是内容复制的话,集合里面的元素也是内容复制么?可变使用cop

10、y表示深拷贝,不可变集合类使用copy的时候是浅拷贝。可变集合类、不可边类型使用mutablecopy表示深拷贝当是浅拷贝的时候,容器的内容是没有复制的。如果是深拷贝的话,容器的内容都会收到一条copy消息,拷贝出新的内容,从新组成新的容器返回。9.为什么IBOutlet修饰的UIView也适用weak关键字?在xib或者Sb拖控件时,其实控件就加载到了父控件的subviews数组里面,进行了强引用,即使使用了weak,也不造成对象的释放。10.nonatomic和atomic的区别?atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?nonatomic:表示非原子,不安全,但是

11、效率高。atomic:表示原子行,安全,但是效率低。atomic:不能绝对保证线程的安全,当多线程同时访问的时候,会造成线程不安全。可以使用线程锁来保证线程的安全。11.UICollectionView自定义layout如何实现?实现一个自定义layout的常规做法是继承UICollectionViewLayout类,然后重载下列方法:-(CGSize)collectionViewContentSize返回collectionView的内容的尺寸-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect返回rect中的所有的元素的布局属

12、性返回的是包含UICollectionViewLayoutAttributes的NSArrayUICollectionViewLayoutAttributes可以是cell,追加视图或装饰视 图的信息,通过不同的UICollectionViewLayoutAttributes初始化方法可以得到不同类型的UICollectionViewLayoutAttributes: layoutAttributesForCellWithIndexPath: layoutAttributesForSupplementaryViewOfKind:withIndexPath:layoutAttributesFor

13、DecorationViewOfKind:withIndexPath: -(UICollectionViewLayoutAttributes )layoutAttributesForItemAtIndexPath:(NSIndexPath )indexPath返回对应于indexPath的位置的cell的布局属性-(UICollectionViewLayoutAttributes )layoutAttributesForSupplementaryViewOfKind:(NSString )kind atIndexPath:(NSIndexPath *)indexPath返回对应于indexPa

14、th的位置的追加视图的布局属性,如果没有追加视图可不重载-(UICollectionViewLayoutAttributes * )layoutAttributesForDecorationViewOfKind:(NSString)decorationViewKind atIndexPath:(NSIndexPath )indexPath返回对应于indexPath的位置的装饰视图的布局属性,如果没有装饰视图可不重载-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds当边界发生改变时,是否应该刷新布局。如果YES则在边界变

15、化(一般是scroll到其他地方)时,将重新计算需要的布局信息。12.用StoryBoard开发界面有什么弊端?如何避免?使用简单逻辑页面的跳转是可以使用sb的,开发比较块。但是SB对于逻辑项目比较复杂的时候,开发起来比较慢。不适合多人合作开发;也不利于版本的梗系和后期的维护。使用sb在项目变异编译的时候,也都会直接加载到内存中,造成内存的浪费。可以使用xib来代替,编辑复杂逻辑界面时候可以使用纯码编写。13.进程和线程的区别?同步异步的区别?并行和并发的区别?进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.同步:阻塞当前线程操作,不能开辟线程。异步:不阻碍线程继续操作,可以开辟线程来执行任务。并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号