外行如何国家开发银行面试通知IOS开发

Objective-C的类可以多重继承么?可以采用多个协议么?
不可以多重继承,可以采用多个协议.
objc使用什么机制管理对象内存?
MRC 手动引用计数
ARC 自动引用计数,现在通常使用自动引用计数
import 跟#include 又什么区别,@class呢, #import&& 跟 #import&&又什么区别?
import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import&&用来包含系统的头文件,#import&&用来包含用户头文件。
描述一下iOS SDK中如何实现MVC的开发模式
MVC是模型、试图、控制开发模式,对于iOS SDK,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据。
浅复制和深复制的区别?
浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。
category是什么? 扩展一个类的方式用继承好还是类目好? 为什么?
category是类目.用类目好,因为继承要满足A is a B的关系,而类目只需要满足A has a B的关系,局限性更小,你不用定义子类就能扩展一个类的功能,还能将类的定义分开放在不同的源文件里,用category去重写类的方法,仅对本category有效,不会影响到其他类与原有类的关系。
延展是什么? 作用是什么?
延展(extension):在自己类的实现文件中添加类目来声明私有方法。
解释一下懒汉模式?
懒汉模式,只在用到的时候才去初始化。也可以理解成延时加载。我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。一个延时载,避免内存过高,一个异步加载,避免线程堵塞。
@property中有哪些属性关键字?
属性可以拥有的特质分为四类:
原子性&- nonatomic 特质
在默认情况下,由编译器合成的方法会通过锁定机制确保其原子性(atomicity)。如果属性具备 nonatomic 特质,则不使用同步锁。请注意,尽管没有名为&atomic&的特质(如果某属性不具备 nonatomic 特质,那它就是&原子的& ( atomic) ),但是仍然可以在属性特质中写明这一点,编译器不会报错。若是自己定义存取方法,那么就应该遵从与属性特质相符的原子性。
读/写权限&-readwrite(读写)、readonly (只读)
内存管理语义&-assign、strong、 weak、copy方法名&-getter=&、setter=
你经常使用一些第三方库有哪些?
AFNetworking
SDWebImage
MJExtension
友盟,shareSDK等三方库。
你经常用的设计模式有哪些?
观察者模式
本地存储有哪些方式?
属性列表(NSUserDefault 或 plist)
对象归档 (NSKeyedArchiver)
weak属性需要在dealloc中置nil么?
不需要,在ARC环境无论是强指针还是弱指针都无需在deallco设置为nil,ARC会自动帮我们处理。
@synthesize和@dynamic分别有什么作用?
@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果@synthesize和@dynamic都没写,那么默认的就是@syntheszie var = _
@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。
@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。
用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
什么时候会报unrecognized selector的异常?
当该对象上某个方法,而该对象上没有实现这个方法的时候
使用block时什么情况会发生引用循环,如何解决?
只要是一个对象对该block进行了强引用,在block内部有直接使用到该对象。
解决方案:__weak id weakSelf =&
使用系统的某些block api(如UIView的block版本写动画时),是否也考虑引用循环问题?
一般不用考虑,因为官方文档中没有告诉我们要注意发生强引用,所以推测系统控件一般没有对这些block进行强引用,所以我们可以不用考虑循环强引用的问题
GCD的队列(dispatch_queue_t)分哪两种类型?
串行队列和并行队列
如何用GCD同步若干个异步调用?(如根据若干个url异步加载多张图片,然后在都下载完成后合成一张整图)
总体上说: 使用 dispatch group,然后 wait forever 等待完成, 或者采取 group notify 来通知回调。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, queue, ^{
以下代码运行结果如何?
只能输出1,然后线程主线程死锁
- (void)viewDidLoad{
[super viewDidLoad];
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
NSLog(@"3");}
若一个类有实例变量NSString *_foo,调用setValue:forKey:时,可以以foo还是_foo作为key?
IBOutlet连出来的视图属性为什么可以被设置成weak?
因为视图已经对它有一个强引用了
你单例怎么理解怎么用的?
Singleton Pattern单例设计模式,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法。这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。例如,UIApplication的sharedApplication方法,任何时候都会返回一个当前应用程序的UIApplication实例。
lldb(gdb)常用的调试命令?
最常用就是 : po 对象
什么是谓词?
谓词是通过NSPredicate,是通过给定的逻辑条件作为约束条件,完成对数据的筛选。
+(void) +(void) 的区别?
+(void) 在程序运行后立即执行。+(void) 在类的方法第一次被调时执行.
什么是KVC,什么是KVO?
kvc:键 - 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。
kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。
什么时候用delegate,什么时候用Notification?
delegate针对one-to-one关系,并且reciever可以返回值 给sender,notification 可以针对one-to-one/many/none,reciever无法返回值给sender.所以,delegate用于sender希望接受到 reciever的某个功能反馈值,notification用于通知多个object某个事件
block和weak区别?
__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。&
__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。&
block对象可以在block中被重新赋值,weak不可以。
frame和bounds有什么不同?
frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
UIView和CALayer有什么不同?
两者最大的区别是,图层不会直接渲染到屏幕上,UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器。一个UIView上可以有n个CALayer,每个layer显示一种东西,增强UIView的展现能力。
TCP和UDP的区别?
TCP:(传输控制协议),提供面向连接的、可靠地点对点的通信;
UDP:(用户数据报协议),提供非连接的不可靠的点对多点的通信;
实际运用中,看程序注重的是哪一方面,是可靠还是快速;
socket连接与http连接
http连接:短连接。即客户端向服务端发送一次请求,服务端响应之后,链接即会断掉;
socket连接:长连接。即客户端一旦与服务器建立接连,便不会主动断掉。
HTTP 的post与get区别与联系,实践中如何选择它们?
get是从服务器上获取数据,post是向服务器传送数据。
在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
检查内存管理问题的方式有哪些
点击Xcode顶部菜单中的Product&Analyze。这种方法主要可以查看内存泄露,变量未初始化,变量定义后没有被使用到
使用Instrument工具检查。点击Xcode顶部菜单中的Product Profile,弹出一个界面,选择左侧的Memory后,再选右侧的Leaks。
谈安卓与苹果的优缺点
苹果系统优点是左右流畅,软件多,界面华丽,图标统一,很美观;缺点是系统封闭,不允许用户过多的个性化设置,而且只能在苹果手机上用。安卓系统优点是开放,可以自己扩展的东西很多,支持的硬件也多,各个价位的手机都有;缺点就是软件太杂乱,兼容性有问题,图标混乱不美观。iOS的确比android流畅,这仅仅体现在较大软件切换时,其他差不多流畅,iOS并不能做到完全后台,如果它完全后台估计也不会比安卓流畅多少。反之,如果安卓只是注重单个运行,流畅度也会大大提升,iOS系统更新没有android那么频繁,爱体验的人会选安卓,那些怕烦的会选iOS。iOS的硬件需求选不及android,以至于android机会相对iOS较热,较费电额。
运行时你是怎么理解的?
ObjC Runtime 其实是一个 Runtime 库,基本上用 C 和汇编写的,这个库使得 C 语言有了面向对象的能力(脑中浮现当你乔帮主参观了施乐帕克的 SmallTalk 之后嘴角一抹浅笑)。这个库做的事前就是加载类的信息,进行方法的分发和转发之类的。OC是一种面向runtime(运行时)的语言,也就是说,它会尽可能地把代码执行的决策从编译和链接的时候,推迟到运行时。这给程序员写代码带来很大的灵活性,比如说你可以把消息转发给你想要的对象,或者随意交换一个方法的实现之类的。这就要求runtime能检测一个对象是否能对一个方法进行响应,然后再把这个方法分发到对应的对象去。
@protocol 和 category 中如何使用 @property
在 protocol 中使用 property 只会生成 setter 和 getter 方法声明,我们使用属性的目的,是希望遵守我协议的对象能实现该属性
category 使用 @property 也是只会生成 setter 和 getter 方法的声明,如果我们真的需要给 category 增加属性的实现,需要借助于运行时的两个函数:
objc_setAssociatedObject
objc_getAssociatedObject
每一个类对象中都一个方法列表,方法列表中记录着方法的名称,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现.
一个objc对象如何进行内存布局?
所有父类的成员变量和自己的成员变量都会存放在该对象所对应的存储空间中.
每一个对象内部都有一个isa指针,指向他的类对象,类对象中存放着本对象的
对象方法列表(对象能够接收的消息列表,保存在它所对应的类对象中)
成员变量的列表,
它内部也有一个isa指针指向元对象(meta class),元对象内部存放的是类方法列表,类对象内部还有一个superclass的指针,指向他的父类对象。
我的愿望是.......
世界和平.........
阅读(...) 评论()南京IOS培训中心
美国上市公司 · 亿元级外企IOS培训企业
课程咨询 :025-
ios面试必问的5个问题
但如果你是一个iOS开发门外汉,在雇佣iOS开发者时,你怎么知道该选择谁才是上上策?为此,Empirical Development联合创始人Marcus S. Zarra总结了5个在选择iOS应用开发者时最应该问的问题。
问题1. 请问你可以提供一份示例项目投标书吗?
iOS应用已经从“品牌”过渡到“应用”阶段,因此,开发者需要对应用开发更加认真地对待。作为老板的你,如果想要应用“形色味俱佳”,那么势必要和开发者一起进行应用规划,在完成各项规划之后,就可以正式开始应用设计与开发。
如果开发者无法拿出一份正式的项目投标书,那么你就需要问问自己,他们对于这个项目有多重视?他们能有多大的兴趣和精力投入到你的项目之中?
如果前来应聘的开发者对于“固定费用”或“按时计”都没有异议的话,那么开发者至少应该告诉你,他们认为多长时间能够完成该项目。还有,他们所提交的投标书,至少应该包括对整个项目的分解或功能说明,以及各方面的成本估算。
问题2. 你的投标书有多精确?
这个问题是连着上一个问题的。在还没有开始之前,竞标者就必须要对他们将要花费的开发时日进行估算,并且,还得保证100%的准确,当然,这不太现实,但却是软件开发行业公认的一项明规则。
因此,优秀的开发工作室或个人会对他们投入到每个项目中的时间进行详细的追踪记录,并将实际所花费的时间与原本投标估算时间进行对比。如果一个开发者 没有对时间进行追踪记录而对他们的投标进行比较的话,他们根本就不知道自己的投标有多准确,更糟糕的是,你也根本无法知晓他们的投标到底精不精确。
高利润是一回事儿,投机取巧却又是另一回事儿,一不小心的话,难保你不是在玩火自焚。
问题3. 你的应用平均评级是多少?
App Store的应用评级系统可谓是非常善变,遭诟病也不是一两日的事情了。不仅没有评级过滤,而且还可以对用户进行设置,让他们生成一星级评论。对于大众而言,这显然不是一件好事。
另一方面,如果大部分应用是靠正规途径发布的,它们就根本得不到大量的一星级或二星级好评。用户更倾向于使用那些靠大肆宣传博上位或靠刷榜提升排名、下载量等非正规渠道推广的应用。如果一款应用的平均增长率低于三星级,那么就应该对它的排名及评级等一切信息表示怀疑。
相比之下,App Store中的便宜应用获取一星级评分的机会要高许多,至于免费应用获取一星级评分的事情更是不言而喻。
应用评级意味着:
免费应用:如果开发者在App Store中有着大量的免费应用,这些应用的评级是高还是低?三星及其以上应该是免费应用的一般标准,如果低于三星,那说明要么开发不行,要么内容贫乏。
付费应用:如果开发者有付费应用,那么平均评级应该更高。如果一个3.99美元的应用在三星之下,那么就非常可疑。对于任何4.99美元及其以上应用来说,四星是最低限度。
介于免费和4.99美元之间的应用:这样的应用很难有一个硬性规定,用户可能会花一点钱去购买,但如果应用实在不咋地,那评级肯定会非常低。
因此,开发者应该对于他们在App Store中的平均评级、应用下载量的近似值或平均数了如指掌。如果应用平均下载量低于1000的话,那么评级的真实性就有待考察了。如果开发者不知道他 们的App Store评级,这是一个很危险的信号。应用的idea毫无新意或内容贫乏所造成的应用下载量偏低是一回事,但不关心评级却又是另一回事。
问题4. 请简单地描述一下你的测试过程
相比上一个问题,这个问题对专业能力要求更强。如果来面试的是一个独立开发者或小型开发团队,那么这个问题会让他们感到紧张。正常情况下,小型开发团 队无法为他们所开发的应用提供充分的测试,因此,他们可能会如此回答——“我让客户端处理测试”。对于小团队而言,这个回答可以接受,而较大的开发团队则 应该采取内部测试的方法。
常见的测试方法:
聘请一个或多个QA工程师;
Round Robin测试法,将测试交给不积极编程的开发人员;
第三方测试。
应用测试有一个大忌,就是不要让开发者自己对应用进行测试。也许他们能够测试应用能否正常运行,但却永远无法测试出边缘情况或意想不到的用户习惯。
问题5. 请简述一下你的代码审查过程
这个问题又是一门软科学。如果你雇佣的是一个独立开发者,那么他/她将不能对自己的代码进行审查,而对于规模大于一的开发团队,应该都有一个严格的代码审查制度。
最新开班日期 &|
3G-IOS软件工程师就业班
开班日期:04-28
3G-IOS软件工程师就业班
开班日期:04-28
3G-IOS软件工程师周末班
开班日期:04-28
3G-IOS软件工程师周末班
开班日期:04-28
达内新闻 &|
达内时代科技集团有限公司 版权所有 京ICP证8000853号-56当前位置浏览文章
谈一谈GCD和NSOperation的区别?首先二者都是多线程相关的概念,当然在使用中也是根据不同情境进行不同的选择;GCD是将任务添加到队列中(串行/并发/主队列),并且制定任务执行的函数(同步/异步),其性能最好,底层是C语言的API,也更轻量级。iOS4.0以后推出的,针对多核处理器的并发技术,只能设置某一个队列的优先级,其高级功能有一次性执行dispatch_once,延迟操作dispatch_after,调度组等等;NSOperation把操作(异步)添加到队列中(全局的并发队列),是OC框架,愈加面向对象,是对GCD的封装,iOS2.0推出,苹果推出GCD之后,对NSOperation的底层全部重写,可以随时取消已经设定准备要执行的任务,已经执行的除外,可以设置队列中每一个操作的优先级,其高级功能可以设置最大操作并发数,继续/暂停/全部取消,可以快队列设置操作的依赖关系,通过KVO监听 NSOperation 对象的属性,如 isCancelled、isFinished;对象可重用。NSOperation 相比于 GCD 有哪些优势?提供了在 GCD 中不那么容易复制的有用特性。可以很方便的取消一个NSOperation的执行可以更容易的添加任务的依赖关系提供了任务的状态:isExecuteing, isFinished.谈谈多线程的应用通常耗时的操作都放在子线程处理,然后到主线程更新UI,如我们要从数据库提取数据还要将数据分组后显示,那么就会开个子线程来处理,处理完成后才去刷新UI显示。拍照后,会在子线程处理图片,完成后才回到主线程来显示图片。拍照出来的图片太大了,因此要做处理。音频、视频处理会在子线程来操作文件较大时,文件操作会在子线程中处理做客户端与服务端数据同步时,会在后台闲时自动同步线程之间是怎样通信的?通过主线程和子线程切换的时候传递参数performSelecter:onThread:withObject:waitUntilDone:网络图片处理问题怎么解决图片重复下载问题?(SDWebImage大概实现原理)这个就需要用到字典,以图片的下载地址url为key,下载操作为value,所有的图片大概分成三类:已经下载好的,正在下载的和将要下载的;当一张图片将要进行下载操作的时候,先判断缓存中能否有相同的图片,如果有的话就返回,没有的话就根据url的md5加密值去沙盒中找,有的话就拿出来用,没有的话再去以图片的url为key去字典中找有没有正在进行的任务,最后去判断等待的下载操作任务里面的字典有无相同key,如果没有,就自己开启任务,记录一下,文件保存的名称是url的md5值这里建立了两个字典 :1.iconCache:保存缓存的图片2.blockOperation 用来保存下载任务每当进入或退出程序时,会进行图片文件的管理:超过一星期的文件会被清除,如果设置了最大缓存,超过这个缓存就会删除最旧的文件,直到当前缓存文件为最大缓存文件的一半大小;一般app中大部分缓存都是图片的情况下,可以直接调用clear方法进行清除缓存,getSize()方法获取当前缓存大小。多线程安全的几种解决方法?1.只有在主线程刷新访问UI2.如果要防止资源抢夺,需要用synchronize进行加锁保护3.如果是异步操作要保证线程安全等问题,尽量使用GCD(有些函数默认就是安全的)4.单例为什么用static dispatch_once?使用dispatch_once可以简化代码并且彻底保证线程安全,开发者无需担心加锁或同步。此外,dispatch_once更高效,它没有使用重量级的同步机制,若是那样做的话,每次运行代码前都要获取锁。原子属性原子属性采用的是"多读单写"机制的多线程策略;"多读单写"缩小了锁范围,比互斥锁的性能好规定只在主线程更新UI,就是因为如果在多线程中更新,就需要给UI对象加锁,防止资源抢占写入错误,但是这样会降低UI交互的性能,所以ios设计让所有UI对象都是非线程安全的(不加锁)代理的作用、block代理又叫委托,是一种设计模式(可以理解为java中回调监听机制),代理是对象与对象之间的通信交互,代理解除了对象之间的耦合性改变或传递控制链,允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针,可以减少框架复杂度代理的属性常是assign的原因:防止循环引用,以致对象无法得到正确的释放block底层是根据函数指针和结构体结合实现的,block本身就是结构体,愈加简洁,不需要定义繁琐的协议方法,但通信事件比较多的话,建议使用Delegateblock就是一个数据类型,存放一段代码,编译的时候不会执行,只有用到的时候才会去执行里面的代码。声明的时候使用copy是因为要从栈区拷贝到堆区,在栈区会遭到作用域的限制,超出所在的函数就会被销毁,就没办法进行传值回调等一系列操作了。应注意循环引用,weak来修饰。如果一个变量是在block外部创建,需要在block内部修改,那么需要使用block修饰这个变量(block可以在ARC和MRC情况下使用,可以修饰对象和基本数据类型,weak只能在ARC下使用,只能修饰对象,不能修饰基本数据类型)最常用的是使用block作为参数传值,不同情况下回调不同的代码(如成功回调失败回调)谈谈你对runTime运行时机制的了解(注意哦,这个很重要的)runtime是一套比较底层的纯C语言API,属于一个C语言库,包含了很多底层的C语言的API平时编写的OC代码,在程序运行过程中,其实都是转成了runtime的C语言代码,runtime是OC的幕后工作者,底层语言,例如:OC--& [[WPFPerson alloc] init]runtime--&objc_msgSend(objc_msgSend("WPFPerson", "alloc"), "init")利用runtime可以实现一些非常底层的操作(用OC不好实现)在程序运行过程中,动态创建一个类(比如KVO底层实现:检测isa指针,发现是新建了一个类,当然Xcode7.0以前的版本才可以监听到isa指针)遍历一个类的所有成员变量、方法,访问私有变量(先通过runtime的class_getInstanceVariable获取成员变量,再通过class_getIvar获取它的值)在程序运行过程中,动态为某个类添加属性\方法,修改属性值\方法,比如产品经理需要跟踪记录APP中按钮的点击次数和频率等数据,可以通过集成按钮或者类别实现,但是带来的问题比如别人不一定去实例化你写的子类,或者其他类别也实现了点击方法导致不确定会调用哪一个,runtime可以这样解决:在按钮的分类里面,重写load方法,利用dispatch_once保证只执行一次,新建监控按钮点击的方法,先用class_addMethod方法,判断其返回的bool值,如果添加成功,就用class_replaceMethod将原来的方法移除,如果添加失败,就用method_exchangeImplementations方法进行替换拦截并替换方法,比如由于某种原因,我们要改变这个方法的实现,但是又不能动它的源码(比如一些开源库出现问题的时候,这时候runtime就可以出场了)--&先增加一个tool类,然后写一个我们自己实现的方法-change,通过runtime的class_getInstanceMethod获取两个方法,在用class_replaceMethod方法进行替换。防止数组越界的方法:数组越界的时候报错的方法是add_object,做一个逻辑判断,越界的时候通过class_replaceMethod交换掉add_object(相当于重写了这个方法)相关应用NSCoding(归档和解档),如果一个模型有很多个属性,那么需要对每个属性都实现一遍encodeObject和decodeObjectForKey方法,十分麻烦,但是如果使用class_copyIvarList获取所有属性,然后循环遍历,使用[ivarName substringFromIndex:1]去掉成员变量下划线字典转模型:像几个出名的开源库JSONModel、MJExtension等都是通过这种方式实现的(利用runtime的class_copyIvarList获取属性数组,遍历模型对象的所有成员属性,根据属性名找到字典中key值进行赋值,当然这种方法只能解决NSString、NSNumber等,如果含有NSArray或NSDictionary,还要进行第二步转换,如果是字典数组,需要遍历数组中的字典,利用objectWithDict方法将字典转化为模型,在将模型放到数组中,最后把这个模型数组赋值给之前的字典数组)Method Swizzling:OC中调用方法事实上就是向对象发送消息,而查找消息的唯一依据就是selector的名字,因此可以使用runtime运行时机制动态交换方法。在+load方法里面调换,因为method swizzling的影响范围是全局的,所以应该放在最保险的地方来处理,+load方法能够保证能在类初始化的时候一定能被调用,可以保证统一性,如果是在使用的时候才去调用,可能达不到全局处理的效果;使用dispatch_once保证只交换一次。[objc_getClass("__NSArrayM") swizzleSelector:@selector(addObject:) withSwizzledSelector:@selector(hyb_safeAddObject:)];使用场景:addObject方法添加的值为nil的时候会崩溃。调用objectAtIndex:时出现崩溃提示empty数组问题谈谈你对Run Loop的理解RunLoop是多线程的一个很重要的机制,就是一个线程一次只能执行一个任务,执行完任务后就会退出线程。主线程会通过do-while死循环让程序持续等待下一个任务不退出。通过mach_msg()让runloop没事时进入trap状态,节省CPU资源。非主线程通常来说就是为了执行某个任务而创建的,执行完就会归还资源,因此默认不开启RunLoop实质上,对于子线程的runloop是默认不存在的,因为苹果采用了懒加载的方式,如果没有手动调用[NSRunLoop currentRunLoop]的话,就不会去查询当前线程的RunLoop,也不会创建、加载当然如果子线程处理完某个任务后不退出,需要继续等待接受事件,需要启动的时候也可以手动启动,比如说添加定时器的时候就要手动开始RunLoop怎样处理事件界面刷新: 当UI改变( Frame变化、 UIView/CALayer 的继承结构变化等)时,或手动调用了 UIView/CALayer 的 setNeedsLayout/setNeedsDisplay方法后,这个 UIView/CALayer 就被标记为待处理。 苹果注册了一个用来监听BeforeWaiting和Exit的Observer,在它的回调函数里会遍历所有待处理的 UIView/CAlayer 以执行实际的绘制和调整,并更新 UI 界面。手势识别: 如果上一步的 _UIApplicationHandleEventQueue() 识别到是一个guesture手势,会调用Cancel方法将当前的touchesBegin/Move/End 系列回调打断。随后系统将对应的 UIGestureRecognizer 标记为待处理。 苹果注册了一个 Observer 监测 BeforeWaiting (Loop即将进入休眠) 事件,其回调函数为 _UIGestureRecognizerUpdateObserver(),其内部会获取所有刚被标记为待处理的 GestureRecognizer,并执行GestureRecognizer的回调。 当有 UIGestureRecognizer 的变化(创建/销毁/状态改变)时,这个回调都会进行相应处理。网络请求:最底层是CFSocket层,然后是CFNetwork将其封装,然后是NSURLConnection对CFNetwork进行面向对象的封装,NSURLConnection是iOS7中新增的接口。当网络开始传输时,NSURLConnection创建了两个新线程:com.apple.NSURLConnectionLoader和com.apple.CFSocket.private。其中CFSocket线程是处理底层socket连接的。NSURLConnectionLoader这个线程内部会使用RunLoop来接受底层socket的事件,并添加到上层的Delegate应用滑动与图片刷新:当tableView的cell上有需要从网络获取的图片的时候,滚动tableView,异步线程回去加载图片,加载完成后主线程会设置cell的图片,但是会造成卡顿。可以设置图片的任务在CFRunloopDefaultMode下进行,当滚动tableView的时候,Runloop切换到UITrackingRunLoopMode,不去设置图片,而是而是当停止的时候,再去设置图片。(在viewDidLoad中调用self.imageView performSelector@selector(setImage) withObject:...afterDelay:...inModes@[NSDefayltRunLoopMode])常驻子线程,保持子线程一直处理事件 为了保证线程长期运转,可以在子线程中加入RunLoop,并且给Runloop设置item,防止Runloop自动退出SQLite常用的SQL语句创建表:create table 表名(字段名 字段数据类型 能否为主键, 字段名 字段数据类型, 字段名 字段数据类型...)增:into 表名(字段1,字段2...) values(值1,值2...)删:from 表名 where 字段=值关于Socket,谈谈TCP/IP 和 UDP的理解Socket是一个用于传输网络数据的工具,TCP/IP 和 UDP都是传输协议,用于定义网络数据传输的格式,属于长连接TCP/IP 侧重可靠传输,传输速度慢,不会丢失数据,安全,聊天和下载文件时用到UDP:侧重快速传输,传输速度快,容易丢失数据包,不安全。局域网游戏和网络游戏,视频聊天的时候用到Http:超文本传输协议,用于定义网络数据传输的格式(短链接)http1.0之前不支持短连接,1.1之后默认就是长连接,只要在服务器和客户端同时设置Connection为keep-alive即可长连接是为了复用,长连接指的是TCP连接,也就是为了复用TCP连接,也就是说多个HTTP请求可以复用一个TCP连接,节省了很多TCP连接建立和断开的消耗比如请求了一个网页,这个网页肯定还包含了CSS、JS等一系列资源,如果是短连接的话,每次打开一个网页,基本要建立几个甚至几十个TCP连接,浪费了大量资源长连接不是永久连接,如果一段时间内,具体的时间长短,是可以在header当中进行设置的,也就是所谓的超时时间,这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉socket连接是长连接,客户端与服务器保持通道,双方可以主动发送数据,一般多用于即时通讯,游戏,默认超时时间是30秒,默认大小是8k(一个数据包大小)谈一谈内存管理iOS的内存管理分为 MRC 和 ARC,管理的是堆区动态产生的对象,基本数据类型就不是内存管理的范围内存管理的核心概念是引用计数器:当对象被alloc、copy、new的时候,引用计数器+1,当被release的时候引用计数器 -1,为0的时候就会被系统回收,调用dealloc方法说道内存管理,就必须说说@property的内存管理参数:assign --& 针对于基本数据类型的简单赋值操作retain --& release 一次旧对象 retain 一次新对象 (适用于OC对象类型)copy --& release 一次旧对象 拷贝一个新对象出来(一般修饰字符串和block)weak--& 表示一种非拥有关系,设置该属性时既不释放新值,也不保留旧值,和assign类似,但是目标对象释放时,属性值也会自动清空怎样避免内存泄露 --& 使用Analyze进行代码的静态分析当然使用block的时候最应该注意下循环引用,使用Leaks检测内存泄露,显示绿色的勾告知内存处理的不错,实际上内存得不到释放。一般我的方法是在控制器声明周期的viewDidAppear和dealloc方法里面打印日志[[self class] description],如果没有打印出来,就说明没有被释放。使用weak typeof(self) weakSelf =解决。有一次我是直接使用成员变量,而不是属性,_age,我以为这样没有使用self就可以了,但是后来测试发现还是造成循环引用了,因为_age是控制器的成员变量,也就是强引用了控制器,也要改成弱引用block weak __typeof(_currentModel) weakModel = _currentM常见的数据持久化有哪些偏好设置(preference),利用NSUserDefaults用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,需要先转化为前面的类型,才能用NSUserDefault存储偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。//1.获得NSUserDefaults文件NSUserDefaults userDefaults = [NSUserDefaults standardUserDefaults];//2.向文件中写入内容[userDefaults setObject:@"AAA" forKey:@"a"];[userDefaults setBool:YES forKey:@"sex"];[userDefaults setInteger:21 forKey:@"age"];//2.1立即同步[userDefaults synchronize];//3.读取文件NSString name = [userDefaults objectForKey:@"a"];BOOL sex = [userDefaults boolForKey:@"sex"];NSInteger age = [userDefaults integerForKey:@"age"];NSLog(@"%@, %d, %ld", name, sex, age);归档(Archiver)、解档(unArchiver),利用NSKeyedArchiver实现归档、利用NSKeyedUnarchiver解档归档及时将内存中的对象写入到磁盘文件中,归档也叫序列化,解档就是讲磁盘中文件中的对象读取出来必须遵循NSCoding协议,只要遵循了NSCoding协议的对象都可以通过它实现序列化,两个协议方法必须实现。属性列表数据库:SQLiteCore Data点击查看大神讲解属性列表这五种持久化操作不同点从存储数据大小来看,归档、偏好设置、属性列表三种方法适合存储数据量较小的数据,数据库、CoreData方法适合存储数据量较大的数据从加密性来看,其中归档会将数据进行加密,而偏好设置是直接保存到属性列表中,不会对数据进行加密从存储类型来看,属性列表只能存放固定的七种类型(可在plist文件中看到),归档对存储类型无限制KVC 和 KVOKVC(key-value-coding键值编码,跟多情况下会简化程序代码)的常见用法:给私有变量(该变量不对外开放)赋值:[Person setValue: @"19" ForKeyPath:@"age"]字典转模型:setValuesForKeyWithDictionary取出私有变量:[Person valueForKey:@"age"]没有找到对应的key会崩溃:重写setValueForUndefinedKeyKVC缺点:一旦使用KVC,编译器无法检查出错误,即不会对设置的键、键路径进行错误检查,且执行效率低于自定义的setter和getter方法,因为使用KVC键值编值,必须先解析字符串,然后设置或访问对象的实例变量通过KVO(key-value-observing,典型的观察者模式,被观察的对象必须使用KVC键值编码来修改它的实例变量,这样才能被观察者观察到)监听person对象中name属性发生改变当一个类的属性被观察的时候,系统会通过runtime动态的创建一个该类的派生类,并且会在这个类中重写基类被观察的属性的setter方法,而且系统将这个类的isa指针指向了派生类(NSNotifying_类名),从而实现了给监听的属性赋值时调用的是派生类的setter方法。重写的setter方法会在调用原setter方法前后,通知观察对象值得改变。@synthesize和@dynamic区别是什么这两个关键字都是@property对应的词@synthesize 语义是如果没有手动实现setter和getter方法,那么编译器会自动帮你加上这两个方法@dynamic告诉编译器,属性的setter和getter由用户自己实现,不自动生成(readOnly只实现getter即可),但是如果没有自己实现,编译的时候不会报错,运行的时候就会报错,这就是所谓的动态绑定什么是响应链,它是怎么工作的?响应者对象以一个链的形式串联起来,当第一个响应者对象不能处理事件时,他将事件转发给下一个响应者对象。当发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件;1.先判断自己能否能接收触摸事件2.再判断触摸的当前点在不在自己身上3.如果在自己身上,它会从后往前遍历子控件,遍历出每一个控件后,重启前两步4.如果没有符合条件的子控件,那么自身就是最合适的View
触摸事件的传递是从父控件传递到子控件的,如果一个父控件不能接收事件,那么他里面的子控件也不能接收.找到最合适的视图控件后,就会调用控件的touches方法来作具体的事件处理.touches的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者处理;1.如果当前的View是控制器的View,那么控制器就是上一个响应者2.如果当前的View不是控制器的View,那么他的父控件就是上一个响应者3.在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理4.如果window对象也不处理,则其将事件或消息传递给UIApplication对象5.如果UIApplication也不能处理该事件或消息,则将其丢弃post和get方式的区别GET请求的数据会负载URL之后,即把数据放在HTTP协议头中,以区分URL和传输数据,参数之间以&相连,英文字母/数字,原样发送,如果是空格,转化为+,如果是中文,把字符串用BASE64加密;POST就是把提交的数据放在HTTP包的包体中GET一般用于提交少量数据(最多提交1k,浏览器限制),POST用于提交大量数据(理论上无限制,受服务器限制)GET 无副作用,POST 有副作用GET提交的数据可以在浏览器历史记录中看到,安全性不好,别人可以拿到账号密码,POST不会Get是向服务器发索取数据的一种请求,而POST是向服务器发提交数据的一种请求,只是发送机制不同GET不可以设置书签,POST可以设置书签POST支持更多编码类型且不对数据类型限制什么情况下用POST:请求的结果具有持续性副作用,如数据库添加新的数据行若使用get方法,则表单上手机的数据可能让URL过长要传送的数据不是采用7位的ASCII编码什么情况下用GET:请求是为了查找资源,HTML表单数据仅用来帮助搜索请求结果无持续副作用性的副作用手机的数据及HTML表单内的输入字段名称的总长不超过1024个字符POST和PUT区别POST请求的url表示处理该封闭实体的资源,该资源可能是个数据接收过程、某种协议的网关、或者接收注解的独立实体。PUT请求中的url表示请求中封闭的实体-用户代理知道url的目标,并且服务器无法将请求应用到其他资源。如果服务器希望该请求应用到另一个url,就必须发送一个301响应;用户代理可通过自己的判断来决定能否转发该请求。POST是用来提交数据的。提交的数据放在HTTP请求的正文里,目的在于提交数据并用于服务器端的存储,而不允许用户过多的更改相应数据(主要是相对于在url 修改要麻烦很多)。PUT操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同POST操作既不是安全的,也不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。安全和幂等的意义在于:当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。从这个意义上说,POST操作往往是有害的,但很多时候我们还是不得不使用它。还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST 是作用在一个集合资源之上的,而PUT操作是作用在集合的一个具体资源之上的,再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。深复制和浅复制非集合类对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制非集合类对mutable对象进行copy和mutableCopy都是内容复制。在集合类对象中,对immutable对象进行copy,是指针复制,mutableCopy是内容复制在集合类对象中,对mutable对象进行copy和mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。NSString str = @"string"; str = @"newString"; 打印对象地址,发现是发生变化的,需要把@"newStirng"当做一个新的对象,将这段对象的内存地址赋值给str关于项目中动画的使用序列帧动画:self.imageView.animationImages =[UIView animateWithDuration] + CGAffinetransform核心动画CABasicAnimation anim = [CABasicAnimation animationWithKeyPath:@"position.y"]; anim.fromValue toValue repeat[btn.layer addAnimation]关键帧动画CAKeyframeAnimation,anim.values = array,添加到layer上组动画CAAnimationGroup,将以上动画组合起来转场动画:CATransition,设置duration和type,然后添加到layer上。利用UIView 的类方法实现转场动画[UIView transitionWithView: duration: options: animations:^{ } completion:nil];UIDynamicAnimator仿真者 、 UISnapBehavior吸附行为,设置damping来调节震动幅度 、 UIPushBehavior推动行为 、 UICollisionBehavior碰撞边缘检测行为 、 UIAttachmentBehavior附着行为 、 UIGravityBehavior重力行为POPSpringAnimationspringBounciness[0,20]越大振幅越大。springSpeed速度为什么AFN显示图片不如SDWebImage流畅?同样是从网络上下载图片而不是从缓存取图片?因为SDWebImage有一个decoderUIImage的imageWithData函数是每次画图的时候才将Data解压成ARGB的图像所以每次画图的时候,会有一个解压操作,这样效率很低,但是只有瞬时的内存需求为了提高效率通过SDWebImageDecoder将包装在Data的资源解压,然后画在另外一张图片上,这样新的图片就不再需要重复解压了这是典型的空间换时间的做法}

我要回帖

更多关于 工行软件开发中心面试 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信