ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:22.15KB ,
资源ID:16923356      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16923356.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(一个区分度很大的面试题Word文件下载.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

一个区分度很大的面试题Word文件下载.docx

1、 遵守NSCopying协议 实现 - (id)copyWithZone:(NSZone *)zone; 方法 如果面试官说否,是属性中如何使用copy 在使用字符串和block的时候一般都使用copy如何重写带 copy 关键字的 setter 重写copy的setter方法时候,一定要调用一下传入的对象的copy方法,然后在赋值给该setter的方法对应的成员变量这一套问题区分度比较大,如果上面的问题都能回答正确,可以延伸问更深入点的:property 的本质是什么ivar、getter、setter 是如何生成并添加到这个类中的 在普通的OC对象中,property就是编译其自动帮我们生

2、成一个私有的成员变量和setter与getter方法的声明和实现 我为了搞清属性是怎么实现的,曾经反编译过相关的代码,他大致生成了五个个东西 OBJC_IVAR_$类名$属性名称 该属性的偏移量 setter与getter方法对应的实现函数 ivar_list 就是成员变量列表 method_list 方法列表 prop_list 属性列表 也就是说我们每次在增加一个属性,系统都会在ivar_list中添加一个成员变量的描述,在method_list中增加setter与getter方法的描述,在属性列表中增加一个属性的属性的描述,然后计算该属性在对象中的偏移量,然后伸出setter与gette

3、r方法对应的实现,在setter方法方法中从偏移量的位置开始赋值,在getter方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转.protocol 和 category 中如何使用 property1 在protocol中使用property只会生成setter和getter方法声明,我们使用属性的目的,是希望遵守我协议的对象的实现该属性2 category 使用 property 也是只会生成setter和getter方法的声明,如果我们真的需要给category增加属性的实现,需要借助于运行时的两个函数1 objc_setAssociatedObjec

4、t2 objc_getAssociatedObjectruntime 如何实现 weak 属性runtime 对注册的类, 会进行布局,对于 weak 对象会放入一个 hash 表中。 用 weak 指向的对象地址作为 key,当此对象的引用计数为0的时候会 dealloc, 进而在这个 weak 表中找到此对象地址为键的所有 weak 对象,从而设置为 nil每个人擅长的领域不一样,我们一般会从简历上找自己写擅长的技术聊,假如自己并不是很熟,最好别写出来或扯出来,万一面试官刚好非常精通这里就露馅了。Checklist总结过些面试题,没坚持下去,后来把这些当 checklist,面试的时候实在

5、没话聊的时候做个提醒,语言、框架、运行机制性质的:property中有哪些属性关键字同上weak属性需要在dealloc中置nil么不需要,在ARC环境无论是强指针还是弱指针都无需在deallco设置为nil,ARC会自动帮我们处理synthesize和dynamic分别有什么作用1 property有两个对应的词,一个是synthesize,一个是dynamic。如果synthesize和dynamic都没写,那么默认的就是syntheszie var = _var;2 synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。3

6、dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为dynamic var,然后你没有提供setter方法和getter方法,编译的时候没问题,但是当程序运行到 =someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。ARC下,不显示指定任何属性关键字时,默认的关键字都有哪些1 对应基本数据类型默认关键字是2 atomic,readwri

7、te,assign3 对于普通的OC对象4 atomic,readwrite,strong用property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么如果改用strong关键字,可能造成什么问题1 因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.2 如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.synthesize合成实例变量的规则是什么假如prope

8、rty名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么如果没有指定成员变量的名称与自动生成一个属性同名的成员变量,如果指定的成员变量的名称,会生成一个指定的名称的成员变量,如果这个成员已经存在了就不再生成了.如果是 synthesize foo; 还会生成一个名称为foo的成员变量如果是 synthesize foo = _foo; 就不会生成成员变量了.在有了自动合成属性实例变量之后,synthesize还有哪些使用场景synthesize主要就是用来生成setter,getter方法的实现,在property被增强之后,其实已经很少使用synthesize了,你知道sy

9、nthesize的其他使用场景吗 能给我介绍一下吗如果你听懂了,感觉面试官说的很有道理,可以说点赞美的话.objc中向一个nil对象发送消息将会发生什么1 在Objective-C中向nil发送消息是完全有效的只是在运行时不会有任何作用: 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil)。例如:Person * motherInlaw = aPerson spouse mother;如果spouse对象为nil,那么发送给nil的消息mother也将返回nil。 如果方法返回值为指针类型,其指针大小为小于或者等于sizeof(void*),float,double,lon

10、g double 或者long long的整型标量,发送给nil的消息将返回0。 如果方法返回值为结构体,发送给nil的消息将返回0。结构体中各个字段的值将都是0。 如果方法的返回值不是上述提到的几种情况,那么发送给nil的消息的返回值将是未定义的。objc中向一个对象发送消息obj foo和objc_msgSend()函数之间有什么关系该方法编译之后就是objc_msgSend()函数调用.如果我没有记错的大概是这样的.(void ()(id, SEL)(void)objc_msgSend)(id)obj, sel_registerName(foo);什么时候会报unrecognized s

11、elector的异常 当该对象上某个方法,而该对象上没有实现这个方法的时候一个objc对象如何进行内存布局(考虑有父类的情况) 所有父类的成员变量和自己的成员变量都会存放在该对象所对应的存储空间中. 每一个对象内部都一个isA指针,指向他的类对象,类对象中存放着本对象的对象方法列表和成员变量的列表,属性列表,它内部也有一个isA指针指向元对象(meta class),元对象内部存放的是类方法列表,类对象内部还有一个superclass的指针,指向他的父类对象 根对象就是NSobject 如图: 一个objc对象的isa的指针指向什么有什么作用 指向他的类对象,从而可以找到对象上的方法下面的代码

12、输出什么implementation Son : Father- (id)init self = super init; if (self) NSLog(%, NSStringFromClass(self class);, NSStringFromClass(super class); return self;end输出的结果都是:Son,原因:super 和 self 都是指向的本实例对象的,不同的是,super调用的跳过本类方法,调用父类的方法父类方法的class方法本来都是在基类中实现的,所以无论使用self和super调用都是一样的.具体分析参照刨根问底ObjectiveC Runti

13、me(1) Self & Superruntime如何通过selector找到对应的IMP地址(分别考虑类方法和实例方法) 每一个类对象中都一个方法列表,方法列表中记录着方法的名称,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现.使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么 在ARC下不需要 在MRC中,对于使用retain或copy策略的需要objc中的类方法和实例方法有什么本质区别和联系 类方法 类方法是属于类对象的 类方法只能通过类对象调用 类方法中的self是类对象 类方

14、法可以调用其他的类方法 类方法中不能访问成员变量 类方法中不定直接调用对象方法 实例方法 实例方法是属于实例对象的 实例方法只能通过实例对象调用 实例方法中的self是实例对象 实例方法中可以访问成员变量 实例方法中直接调用实例方法 实例方法中也可以调用类方法(通过类名)_objc_msgForward函数是做什么的,直接调用它将会发生什么1 没哟研究过,从名字来看是用来转发消息的,你能给我讲讲吗谢谢!runtime如何实现weak变量的自动置nil1. 没有研究过,你有研究过吗,可以给我讲讲吗2. 我猜系统会维护一个弱指针列表,当某个对象销毁时候,它会把所有指向该对象的弱指针设置为nil能否

15、向编译后得到的类中增加实例变量能否向运行时创建的类中添加实例变量为什么 因为编译后的类已经注册在 runtime 中,类结构体中的 objc_ivar_list 实例变量的链表 和 instance_size 实例变量的内存大小已经确定,同时runtime 会调用 class_setIvarLayout 或 class_setWeakIvarLayout 来处理 strong weak 引用。所以不能向存在的类中添加实例变量,运行时创建的类是可以添加实例变量,调用 class_addIvar 函数。但是得在调用 objc_allocateClassPair 之后,objc_registerCl

16、assPair 之前,原因同上。runloop和线程有什么关系 1. 每一个线程中都一个runloop,只有主线的的runloop默认是开启的,其他线程的runloop是默认没有开启的 2. 可以通过CFRunLoopRun() 函数来开启一个事件循环 3. 看SDWebImage源码的时候见到有这么用过.runloop的mode作用是什么model 主要是用来指定时间在运行循环中的优先级的苹果公开提供的 Mode 有两个:kCFRunLoopDefaultModekCFRunLoopCommonModes如果我们把一个NSTimer对象以kCFRunLoopDefaultMode添加到主运行

17、循环中的时候,当一直有用户事件处理的时候,NSTimer将不再被调度如果我们把一个NSTimer对象以kCFRunLoopCommonModes添加到主运行循环中的时候,当一直有用户事件处理的时候,NSTimer还能正常的调度,互不影响.以+ scheduledTimerWithTimeInterval.的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么如何解决猜想runloop内部是如何实现的 1. 他是一个死循环 2.如果事件队列中存放在事件,那就取出事件,执行相关代码 3.如果没有事件,就挂起,等有事件了,立即唤醒事件循环,开始执行. 简单来说。function

18、loop() initialize(); do var message = get_next_message(); process_message(message); while (message != quit);objc使用什么机制管理对象内存* MRC 手动引用计数* ARC 自动引用计数,现在通常使用自动引用计数ARC通过什么方式帮助开发者管理内存通过编译器在编译的时候,插入如内管理的代码不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放(比如在一个vc的viewDidLoad中创建)在每次事件循环开始创建自动释放池,在每次事件结束销毁自动释

19、放池以viewDidLoad方法为例,可以理解为在viewDidLoad方法开始执行之前创建自动释放池,在viewDidLoad方法执行之后销毁自动释放吃BAD_ACCESS在什么情况下出现1. 死循环了2. 访问一个僵尸对象苹果是如何实现autoreleasepool的1. 我猜想autoreleasepool 本质就是一个队列(数组),2. 当调用autorelease的时候会把该对象添加到autoreleasepool中,并且把引用计数+13. 当autoreleasepool即将销毁的时候,把其中的所有对象进行一次release操作使用block时什么情况会发生引用循环,如何解决 只要

20、是一个对象对该block进行了强引用,在block内部有直接使用到该对象,在block内如何修改block外部变量1 通过 _bock修改的外部变量,可以在block内部修改2 想装B的话可以说一下_bock内部做了什么事使用系统的某些block api(如UIView的block版本写动画时),是否也考虑引用循环问题一般不用考虑,因为官方文档中没有告诉我们要注意发生强引用,所以推测系统控件一般没有对这些block进行强引用,所以我们可以不用考虑循环强引用的问题GCD的队列(dispatch_queue_t)分哪两种类型 串行队列和并行队列如何用GCD同步若干个异步调用(如根据若干个url异步

21、加载多张图片,然后在都下载完成后合成一张整图) 总体上说: 使用 dispatch group,然后 wait forever 等待完成, 或者采取 group notify 来通知回调。 细节: 1. 创建异步队列 2. 创建dispatch_group dispatch_group_t = dispatch_group_create() 3. 通过组来执行异步下载任务 dispatch_group_async(queueGroup, aQueue, 下载图片.); ); 4.等到所有任务完成 dispatch_group_wait(queueGroup, DISPATCH_TIME_FOR

22、EVER); 5.合成图片dispatch_barrier_async的作用是什么barrier:是障碍物的意思,在多个并行任务中间,他就像是一个隔离带,把前后的并行任务分开.dispatch_barrier_async 作用是在并行队列中,等待前面操作并行任务完成再执行dispatch_barrier_async中的任务,如果后面还有并行任务,会开始执行后续的并行任务苹果为什么要废弃dispatch_get_current_queue容易误用造成死锁以下代码运行结果如何- (void)viewDidLoad super viewDidLoad;1 dispatch_sync(dispatch

23、_get_main_queue(), 231 只能输出1,然后线程主线程死锁addObserver:forKeyPath:options:context:各个参数的作用分别是什么,observer中需要实现哪个方法才能获得KVO回调 调用对象:要监听的对象 2. 参数 1 观察者,负责处理监听事件的对象 2 观察的属性 3 观察的选项 4 上下文 */ addObserver:self forKeyPath:name options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:Person Name;

24、2. 观察的对象 3. change 属性变化字典(新旧) 4. 上下文,与监听的时候传递的一致 可以利用上下文区分不同的监听!- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 睡会 %, NSThread currentThread); NSThread sleepForTimeInterval:% % % %, keyPath, object, change, context);如何手动触发一个value的KVO1.通过setValue:forKey: 给属性赋值2.通过setValue:3.直接调用setter方法方法给属性赋值4.直接通过指针给属性赋值5.给这个value设置一个值,就可以触发了若一个类有实例变量NSString *_foo,调用setValue:时,可以以foo还是_foo作为key 都可以KVC的keyPath中的集合运算符如何使用1. 必须用在集合对象上或普通对象的集合属性上2. 简单集合运算符有avg, count , max , min ,sum,3. 格式 或 集合属性KVC和KVO的keyPath一定是属性么1.一个可以是成员变量

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1