北风网iOS面试题库(五)

合集下载

iOS常见面试提问

iOS常见面试提问

1、frame bouns 区别在view中画出区别frame: 该view在父view坐标系统中的位置和大小。

bounds:该view在本地坐标系统中的位置和大小center:该view的中心点在父view坐标系统中的位置和大小。

2、代理、单例手写代码3、设计模式延迟加载监听 kvo mvc4、深拷贝浅拷贝区别举例开发工程中哪些实现了这些 ios中哪个实现了深拷贝5、动画 view中哪里可以实现动画6、layer 与view的区别7、绘制图片文字你的思路8、你站在开发者角度为啥需要设计代理9、retain 与copy的区别10、多线程 nsthread nsoperetation gcd11、block __block为啥需要这个12、数据库实现中遇到的问题13、使用过的开源api 以及使用时遇到的问题以及是怎么解决的14、使用代理的好处为啥要使用代理与通知的区别15、同步队列异步队列区别16、怎么解决版本手机兼容性问题1.写一下UIButton与UITableView的层级结构2.Cocoa的Foundation对象与Core Foundation对象通过什么关键字进行转换?这些关键字有什么区别?3.KVO是什么?内部是怎么实现的?4.是否可以把比较耗时的操作放在NSNotificationCenter中处理?为什么?应该如何处理?5.利用NSOperation与NSOperationQueue处理多线程时,有3个NSOperation分别为A,B,C,要求A,B执行完之后,才执行C,如何做?6.在非ARC中,可以对哪些对象加上autorelease关键字,它的作用是什么?被autorelease修饰的对象什么时候释放?7详细说明一下App启动过程,从main文件开始说起.main中有什么函数,几个参数,作用是什么?8CAAnimation是做什么的?写一下它的层级结构(主要是写下其各种子类)?9.iOS7之前,后台执行内容有几种形式,都是什么?10.一个有序的序列M,判断其中是否有两个元素A,B的和为K?如何判断三个元素的A,B,C的和为K呢?1.你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?用过一些比较简单的功能,替换对象的Method,使用AssociatedObject来传值,根据一个Class来获取它的propertyList等等。

ios面试题

ios面试题

ios面试题iOS开发是近年来非常热门和具有挑战性的技术领域之一。

在面试过程中,面试官通常会提出一系列的iOS面试题,以评估应聘者的技术能力和经验。

本文将介绍一些常见的iOS面试题,并提供详细的解答。

1. 请解释MVC设计模式在iOS开发中的作用及优势。

答:MVC(Model-View-Controller)是一种常用的软件设计模式,用于将应用程序的数据、用户界面和业务逻辑进行分离。

在iOS开发中,MVC设计模式有以下作用和优势:- 分离数据和界面:将数据(Model)和用户界面(View)进行分离,使得设计更加清晰和可维护。

- 降低耦合性:通过Controller充当数据和界面之间的中介,实现它们之间的解耦。

- 提高重用性:由于数据、界面和业务逻辑分离,可以更方便地对它们进行重用,提高开发效率。

- 方便协同开发:开发团队可以根据MVC的结构,分工协作,保证项目的高效进行。

2. 请解释UIKit和Foundation框架的区别。

答:UIKit和Foundation是iOS开发中两个重要的框架。

- UIKit是一个用户界面框架,提供了开发iOS应用程序的基础组件,如按钮、标签、文本框等。

它是建立在Core Graphics和Core Animation之上,用于构建用户友好的界面。

- Foundation是一个基础框架,提供了iOS开发中常用的核心功能和数据结构,如字符串处理、日期处理、文件管理等。

它是建立在C语言的基础上,为iOS开发者提供了一系列方便的API。

3. 请解释iOS的生命周期及其对应的方法。

答:iOS应用的生命周期指的是应用从启动到关闭的整个过程,常见的生命周期方法有以下几个:- `application:didFinishLaunchingWithOptions:`:应用程序加载完成后第一个调用的方法,用于初始化应用的数据和设置。

- `applicationWillEnterForeground:`:应用从后台返回前台时调用,可以在该方法中进行数据更新和界面刷新等操作。

IOS面试题总结201505资料

IOS面试题总结201505资料

********************************************mrc给arc传对象在mrc中生成这个对象时添加autorelease********************************************多继承实现OC为单继承,实现多继承可以通过协议代理实现********************************************tableview的优化1.cell重用UITableView是UIScrollView的子类,因此它可以自动响应滚动事件(一般为上下滚动)。

它内部包含0到多个UITableViewCell对象,每个tablecell展示各自的内容。

当新cell需要被显示时,就会调用tableView:cellForRo wAtIndexPath:方法来获取或创建一个cell;而不可视时,它又会被释放。

由此可见,同一时间其实只需要存在一屏幕的cell对象即可,不需要为每一行创建一个cell。

所以,取cell得时候优先从缓存池根据标识取,取不到再创建新的c ell。

cell被重用时,它内部绘制的内容并不会被自动清除,因此你可能需要调用setNeedsDisplayInRect:或setNeedsDisplay方法。

2.加载图片的时候用懒加载,比如用SDWebImage View异步延迟从网络取素材的时间3.数据分页显示,即上拉加载更多4.列表与详情页,使用lazy load(懒加载,延迟加载)5.数据通过多线程异步获取6.如果cell高度是一定的,可以设置TableView中ro wHeight属性,不使用tableView:heightForRowAtI ndexPath:这个方法,减少调用时间7.使用不透明的视图不透明的视图可以极大地提高渲染的速度。

因此如非必要,可以将tablecell及其子视图的opaque属性设为YES(默认值)。

iOS工程师面试题

iOS工程师面试题

1.谈谈你对多线程开发的理解?iOS中有几种实现多线程的方法?好处:1、使用线程可以把程序中占据时间长的任务放到后台去处理,如图片、视频的下载2、发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好缺点:1、大量的线程降低代码的可读性,2、更多的线程需要更多的内存空间3、当多个线程对同一个资源出现争夺的时候要注意线程安全的问题。

iOS有三种多线程编程的技术:1、NSThread(两种创建方式)[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];[myThread start];2、NSOperationQueueNSOperationQueue *oprationQueue = [[NSOperationQueue alloc] init];oprationQueue addOperationWithBlock:^{//这个block语句块在子线程中执行}3、Grand Central Dispatch (GCD)dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRI ORITY_DEFAULT, 0), ^{// 耗时的操作dispatch_async(dispatch_get_main_queue(), ^{// 更新界面});});PS:不显示的创建线程的方法:用NSObject的类方法performSelectorInBackground:withObject: 创建一个线程:[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];1.线程同步和异步的区别?IOS中如何实现多线程的同步?同步:一个线程要等待上一个线程执行完之后才能执行当前的线程,生活中的例子(上厕所)。

ios面试题及答案

ios面试题及答案

ios面试题及答案1.uiview 和 calayer 是什么关系?•uiview 继承 uiresponder,而 uiresponder 是响应者对象,可以对ios 中的事件响应及传递,calayer 没有继承自 uiresponder,所以 calayer 不具备响应处理事件的能力。

calayer 是 quartzcore 中的类,是一个比较底层的用来绘制内容的类,用来绘制ui•uiview 对 calayer 封装属性,对 uiview 设置frame、center、bounds 等位置信息时,其实都是uiview 对 calayer 进一层封装,使得我们可以很方便地设置控件的位置;例如圆角、阴影等属性, uiview就没有进一步封装,所以我们还是需要去设置 layer 的属性来实现功能。

•uiview 是 calayer 的代理,uiview 持有一个 calayer 的属性,并且是该属性的代理,用来提供一些 calayer行的数据,例如动画和绘制。

2.bounds 和 frame 的区别?•bounds:一般是相对于自身来说的,是控件的内部尺寸。

如果你修改了 bounds,那么子控件的相对位置也会发生改变。

•frame :是相对于父控件来说的,是控件的外部尺寸。

3.setneedsdisplay 和 layoutifneeded 两者是什么关系?[图片上传失败...(image-fe66cb-)]uiview的setneedsdisplay和setneedslayout两个方法都是异步执行的。

而setneedsdisplay会自动调用drawrect方法,这样可以拿到uigraphicsgetcurrentcontext进行绘制;而setneedslayout会默认调用layoutsubviews,给当前的视图做了标记;layoutifneeded 查找是否有标记,如果有标记及立刻刷新。

史上最全的iOS面试题及答案

史上最全的iOS面试题及答案

史上最全的iOS面试题及答案1. 1.写一个NSString类的实现+ (id)initWithCString:(c*****t char *)nullTerminatedCStringencoding:(NSStringEncoding)encoding;+ (id) stringWithCString: (c*****t char*)nullTerminatedCStringencoding: (NSStringEncoding)encoding{NSString *obj;obj = [self allocWithZone: NSDefaultMallocZone()];obj = [obj initWithCString: nullTerminatedCString encoding: encoding];return AUTORELEASE(obj);}2static 关键字的作用:(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。

3线程与进程的区别和联系?进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

程和线程的主要差别在于它们是不同的操作系统资源管理方式。

进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。

史上最全的iOS面试题及答案

史上最全的iOS面试题及答案

史上最全的iOS面试题及答案以下是为大家整理的史上最全的ios面试题及答案的相关范文,本文关键词为史上,最全,ios,试题,答案,,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教师教学中查看更多范文。

精品文档.史上最全的ios面试题及答案?1.写一个nsstring类的实现+(id)initwithcstring:(c*****tchar*)nullTerminatedcstringencoding:(nsstringencoding)encoding;+(id)stringwithcstring:(c*****tchar*)nullTerminatedcstringencoding:(nsstringencoding)encoding{nsstring*obj;obj=[selfallocwithZone:nsDefaultmallocZone()];obj=[objinitwithcstring:n ullTerminatedcstringencoding:encoding];returnAuToReLeAse(obj);}2static关键字的作用:(1)函数体内static变量的作用范围为该函数体,不同于auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

3线程与进程的区别和联系?精品文档进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

iOS面试题库(四)有关GCD——北风网分享

iOS面试题库(四)有关GCD——北风网分享

北风网iOS面试题库(四)写在前面:“分享”看似在输出,但实际上是获得更多。

用我们北风网的口号就是“不懂得分享的人,不会很快乐;不懂得分享的教育,不是好教育”。

所以,我们北风网会不定期给大家分享一些干货,所有的内容仅供学习之用,也希望大家能将“分享的精神”传递下去。

一、CGD的底层实现(1)iOS和OS X的核心是XNU内核, GCD是基于XUN内核实现的(2)GCD的API全部在libdispatch库中(3)GCD的底层实现主要有Dispatch Queue 和Dispatch Source(4)Dispatch Queue——管理block操作(5)Dispatch Source——处理事件二、Notification是同步还是异步?Kvo 是同步还是异步?包括代理,这些都是同步的;监听和回调都是在同一个线程中执行。

三、Objective C中的selector是什么?可以理解@selector() 就是取类方法的编号,他的行为基本可以等同C语言中的函数指针,只不过C语言中,可以把函数名之间赋给一个函数指针,而Objective-C的类不能之间应用函数指针,这样只能做一个@selector语法来取。

它的结果是一个SEL类型,这个类型的本质是累方法的编号(函数地址).方法以selector为索引.selector的数据类型是SEL定义成char*,我们可以把它想象成int .每个方法的名字对应一个唯一的值。

四、iOS中哪些操作是属于私有api的范畴?私有API是指存放在PrivateFrameworks框架中的API 是苹果明确不能使用的API 也可以说,一般在官方文档和头文件中看不到,但是实际存在于框架中的API 就是私有API,具体在提交应用的时候回自动检测。

私有API的存在很大一部分是为了保护隐私和系统安全,进制开发者使用这些功能。

但是由于Objective-C的动态特性,使得实际上不可能存在真正意义的阻止调用这些API。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北风网iOS面试题库(五)写在前面:“分享”看似在输出,但实际上是获得更多。

用我们北风网的口号就是“不懂得分享的人,不会很快乐;不懂得分享的机构,不是好机构”。

所以,我们北风网不定期会给大家分享一些干货,所有的内容仅供学习之用,也希望大家能将“分享的精神”传递下去。

一、用一个属性引用UI控件的时候为什么可以用weak?controller 是被系统用强指针引用者,只要它存在,那么里面的子控件也就存在,controller 强引用着它的view controller,又强引用着它的数组对象subviews,数组对象又强引用着它所包含的数组内容,那么创建出来的一个UI控件将其加入subviews的时候,那么就会被一个强指针所引着它对于内存的合理使用,当我们需要控件的时候就已经有一个强引用在引用着它,我们就不必再弄一个强指针来强引用它;当我们不需要的时候,weak直接释放掉,用strong的话就还会保留它,这就占着内存了.二、UITableView 性能优化的原理iOS设备内存有限,如果使用UIT ableView显示非常多的数据,就需要非常多的UI TableViewcell那么设备的内存就会耗尽,解决该问题就需重用UITableView 对象。

当滚动出列表的时候,部分UIT ableViewCell 会移出窗口,UITableView会将窗口外的UITableVIewcell 放入一个对象缓存池中;当UITableView 要求dataSource 返回UIT ableView时,dataSource 会先查看缓存池中是否有未使用的UITableViewCell ,有就用新的数据配置这个UITableViewCell 重新使用到窗口,这就避免了重新创建对象。

三、什么是抽象类?有什么作用?能实例化吗?1、抽象类:abstract修饰,它只能用来作父类,本身并没有生成实例的能力它将一类最公有的属性和方法抽取出来抽象类是将类共有的方法抽取出来,声明为抽象方法, 抽象方法只有声明没有具体的实现, 拥有抽象方法的类就是抽象类; 这样新增一种类型时候只需要继承抽象类,实现抽象方法就可以了,降低了实现新类的难度。

抽象方法修饰符abstract 抽象类不能被实现如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类2、抽象类作用:(1)用于类型隐藏在面向对象领域,抽象类主要用来进行类型隐藏。

我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。

这个抽象描述就是抽象类。

(2)用于拓展对象的行为功能这一组任意个可能的具体实现则表现为所有可能的派生类(子类),模块可以操作一个抽象体。

由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。

四、objc中向一个nil对象发送消息会发生什么?如果没有返回值,nothing will happen;如果有返回值,基本数据类型返回0/0.0/NO等,对象类型返回nil,总的来说就是返回一个假的东西。

五、runloop和线程有什么联系?Runloop和线程的关系:一个Runloop对应着一条唯一的线程问题:如何让子线程不死回答:给这条子线程开启一个RunloopRunloop的创建:主线程Runloop已经创建好了,子线程的runloop需要手动创建Runloop的生命周期:在第一次获取时创建,在线程结束时销六、什么是懒汉模式,一般用在哪些地方?懒加载,指得是需要用到的时候才加载,其好处是节省内存空间,不必一开始就创建所有的变量,用到了就创建一块内存,同时也加快了程序运行速度.一般用于我们只需要创建一次的变量就可以的地方,例如字典转模型的数组,以及控制器的view等,都是懒加载的七、常用的延时执行的几种方式?perform selectorNSTimerGCD:dispatch_after八、写出你想到的设计模式,并简要描述?单例模式:不管怎么创建,拿到的对象都是同一个MVC : MVC把软件系统分为三个部分:Model,View,Controller。

MVC有低耦合性、高重用性、可维护性等优点代理模式: 代理模式就是实现消息传递的一种机制,委托方有一些任务自己不想完成,但是还需要要实现,则将该任务存放到协议中,由代理完成.但是代理并不会主动的执行任务,需要委托方通知代理,然后代理完成委托方交给的任务.观察者模式:经典观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己或者做出相应的一些动作。

比如KVO,通知中心九. 是否使用过CoreText或者CoreImage等?如果使用过,请谈谈你使用CoreText或者CoreImage的体验?用过CoreText是用于处理文字和字体的底层技术。

Quartz能够直接处理字体(font)和字形(glyphs),将文字渲染到界面上,它是基础库中唯一能够处理字形的模块。

因此,CoreText 为了排版,需要将显示的文本内容、位置、字体、字形直接传递给Quartz。

相比其它UI 组件,由于CoreText直接和Quartz来交互,所以它具有高速的排版效果。

coreImage是IOS5中新加入的一个Objective-c的框架,提供了强大高效的图像处理功能,用来对基于像素的图像进行操作与分析. iOS提供了很多强大的滤镜(Filter),其中IOS5中有48种,而到了最新的IOS6 Filter已经增加到了93种之多,并且这一数字会继续增加。

这些Filter提供了各种各样的效果,并且还可以通过滤镜链将各种效果的Filter叠加起来,形成强大的自定义效果,如果你对该效果很满意,还可以子类化滤镜十. POST、GET的区别?(1)POST : 将参数放在请求体中,参数的大小原则上没有限制一般传输的数据包含隐私相关的用POST(2)GET : 将参数附加在URL后面,因为URL长度的限制,所以参数的大小是有限制的,通常不能超过1KBGET 在请求URL后面以? 的形式跟上发给服务器的参数,多个参数之间用&隔开十一、有网络链接的应用中,在取得数据后将json字符串通过框架转为NSDictionary或NSArray,很多人直接使用这些数据来更新UI,说说这样做的缺点,并给出解决办法?(1)在书写的时候有可能写错Key值或者数组角标;(2)扩展性不好,且不符合MVC思想;(3)会造成数据的重复下载,消耗用户的流量,降低用户体验;(4)如果没有网络或者网络堵塞,那么UI界面接受不到任何数据,显示不了任何内容,用户体验糟糕。

解决的办法:(1)通过框架转换为字典或者数组后,在转化模型,并进行二级缓存,需要显示的时候从沙盒中取;(2)利用框架字典转模型重写命名十二、id声明的对象有什么特征?(1)id声明的对象具有运行时的特性,即可用指向任意类型的Objcetive-c的对象,与C中void*的万能指针相似.(2)在编译阶段不知道它的真实类型,运行时才能知道它的真实类型,所以id类型也不能使用点语法是编译时特性,而且id是运行时特性十三、你碰到那些导致程序闪退的原因?如何定位闪退的位置?1、程序闪退的原因?(1)函数无线递归(2)运行时,找不到方法(没实现)(3)访问了某个已经被释放的对象(4)程序占用内存或CPU过高(5)子线程阻塞主UI线程过久(6)从Bundle加载了不存在或者不支持的对象2、如何定位闪退的位置?(1)在设置断点的地方,选Add Exception Breakpoint.之后crash就会停在出错的位置. (2)如果是在测试阶段报错的话,可以在(设置- 通用-关于本机-诊断与用量)里面看到崩溃的堆栈信息.(3)如果用RAC的话,访问到已经释放了的内存,和内存警告这2种粗出错的几率高一些十四、如何实现圆角矩形?有哪些方法可以实现扇形View?直接修改view的样式,系统提供好的了yer.cornerRadius = 6;yer.masksToBounds = YES;用layer做就可以了,十分简单.需要库QuartzCore.framework;画矩形直接利用UIBezierPath给我们封装好的路径方法(x,y)点决定了矩形左上角的点在哪个位置(width,height)是矩形的宽度高度bezierPathWithOvalInRect:CGRectMake(x, y, width, height)[UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 100, 100)];圆角矩形的画法多了一个参数,cornerRadiuscornerRadius它是矩形的圆角半径.通过圆角矩形可以画一个圆.当矩形是正方形的时候,把圆角半径设为宽度的一半,就是一个圆。

UIBezierPath*path = [UIBezierPathbezierPathWithRoundedRect:CGRectMake(50,50,100,100) cornerRadius:50];扇形:画扇形的方法为:先画一个圆孤再添加一个一根线到圆心,然后关闭路径.关闭路径就会自动从路径的终点到路径的起点封闭起下用填充的话,它会默认做一个封闭路径,从路径的终点到起点.[path fill];十五、Cocoa Touch提供了哪几种CoreAnimation过渡类型?Cocoa Touch提供了4中Core Animation 分别是交叉淡化推挤显示和覆盖.十六、能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量,为什么?不能向编译后得到的类中增加实例变量因为编译后的类以及注册在runtime中,类结构同中objc_ivar_list实例变量的链表和instance_size实例变量的内存大小已经确定同时runtime会调用class_setlvarLayout或class_setWeakIvarLayout来处理strong weak 引用。

所以不能向存在的类中添加实例变量能向运行时创建的的类添加实例变量运行时创建的类是可以添加实例变量,调用class_addIvar 函数。

但是得在调用objc_allocateClassPair 之后,objc_registerClassPair 之前,原因同上。

十七、请写出你调试解决crash问题的思路及步骤?1)把问题拆分成多个小问题,一步步检验,直到找到问题的根源点2)程序运行后,查看log信息,找到错误的地方3)在错误的地方设置断点进行调试,可以加条件断点4)查看断点运行的信息,进行修改5) 如果是在测试阶段报错的话,可以在(设置-通用-关于本机-诊断与用量)里面看到崩溃的堆栈信息。

相关文档
最新文档