黑马程序员:IOS面试宝典之OC语言

上传人:tia****nde 文档编号:36890800 上传时间:2018-04-04 格式:DOCX 页数:13 大小:24.38KB
返回 下载 相关 举报
黑马程序员:IOS面试宝典之OC语言_第1页
第1页 / 共13页
黑马程序员:IOS面试宝典之OC语言_第2页
第2页 / 共13页
黑马程序员:IOS面试宝典之OC语言_第3页
第3页 / 共13页
黑马程序员:IOS面试宝典之OC语言_第4页
第4页 / 共13页
黑马程序员:IOS面试宝典之OC语言_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《黑马程序员:IOS面试宝典之OC语言》由会员分享,可在线阅读,更多相关《黑马程序员:IOS面试宝典之OC语言(13页珍藏版)》请在金锄头文库上搜索。

1、OCOC 语言(语言()有人可能会问对于我们学 iOS 的同学来讲,面试还会问 Objective-C 基础吗?答案是会的,但是不会太多,因此我给了两颗星的重要程度。一般笔试的时候出现 Objective-C基础题的概率比较大,口头面试的时候比较少,比如自己在面试的时候一些对基础知识比较看重的面试官会深究着 Objective-C 基础去问,比如 Objective-C 内存管理等等。1 1、Objective-CObjective-C 语法语法1. 面向对象都有哪些特性以及你对这些特性的理解继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类) ;得到继承信

2、息的类被称为子类(派生类) 。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法

3、视为对象向外界提供的服务,那么运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B 系统有多种提供服务的方式,但一切对 A 系统来说都是透明的。方法重载(overload)实现的是编译时的多态性(也称为前绑定) ,而方法重写(override)实现的是运行时的多态性(也称为后绑定) 。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1. 方法重写(子类继承父类并重写父类中已有的或抽象的方法) ;2. 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为) 。抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包

4、括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。2. 我们说的 Objective-C 是动态运行时语言是什么意思? (When we call objective c is runtime language what does it mean?)主要是将数据类型的确定由编译时,推迟到了运行时。这个问题其实浅涉及到两个概念,运行时和多态。简单来说, 运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。多态:不同对象以自己的方式响应 相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;那人类属于

5、生物,猪也属于生物,都 继承了 life 后,实现各自的 eat,但是调用是我们只需调用各自的 eat 方法。也就是不同的对象以自己的方式响应了相同的消 息(响应了 eat 这个选择器)。因此也可以说,运行时机制是多态的基础.3. readwrite, readonly, assign, retain, copy, nonatomic, strong, weak 属性的作用?并区别 strong(强引用)、weak(弱引用)? 什么情况使用 copy,assign 和 retain?readwrite 是可读可写特性;需要生成 getter 方法和 setter 方法时 ; readonly

6、是只读特性 只会生成 getter 方法 不会生成 setter 方法 ,不希望属性在类外改变; assign 是赋值特性,setter 方法将传入参数赋值给实例变量;仅设置变量时;, assign 用于简单数据类型,如 NSInteger,double,bool;retain 表示持有特性,setter 方法将传入参数先保留,再赋值,传入参数的 retaincount会+1; copy 表示赋值特性,setter 方法将传入对象复制一份;需要完全一份新的变量时; nonatomic 非原子操作,决定编译器生成的 setter getter 是否是原子操作;atomic 表示多线程安全,一般使

7、用 nonatomic。 retain 和 copy 用户对象,copy 用于当 a 指向一个对象, b 也想指向同样的对象的时候, 如果用 assign, a 如果释放,再 调用 b 会 crash,如果用 copy 的方式,a 和 b 各自有自己的内存,就可以解决这个问题。retain 会使计数器加 1,也可以解 决 assign 的问题。另外:atomic 和 nonatomic 用来决定编译器生成的 getter 和 setter 是否为原子操作。 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。其实从这个也可以引申到内存管理的一系列问题.面试官会让你讲讲 MRC 和 AR

8、C 的理解,随即也引申出 Block 的内存机制,为啥推荐 Block 用 copy,Block 会存在哪些内存问题?循环引用?4. 分别描述内存管理要点、autorelease、release、NSAutoreleasePool?并说明 autorelease是什 么时候被 release 的?简述什么时候由你负责释放对象,什么时候不由你释放?NSAutoreleasePool release和NSAutoreleasePool drain有什么区别?内存管理要点:Objective-C 使用引用计数机制(retainCount)来管理内存。内存每被引用一次,该内存的引用计数+1,每被释放一

9、次引 用计数-1。当引用计数 = 0 的时候,调用该对象的 dealloc 方法,来彻底从内存中删除该对象。 alloc,allocWithZone,new(带初始化)时:该对象引用计数 +1; retain:手动为该对象引用计数 +1;copy:对象引用计数 +1; mutableCopy:生成一个新对象,新对象引用计数为 1;release:手动为该对象引用计数 -1; autorelease:把该对象放入自动释放池,当自动释放池释放时,其内的对象引用计数 -1。 NSAutoreleasePool: NSAutoreleasePool 是通过接收对象向它发送的 autorelease消息

10、,记录该对象的 release 消息,当自动释放池被销毁时,会自动向池中的对象发送 release消息。 autorelease 是在自动释放池被销毁,向池中的对象发送 release 只能释放自己拥有的对象, 区别是:在引用计数环境下(在不使用 ARC 情况下),两者基本一样,在 GC(垃圾回收制)环境下,release 是一个 no-op(无效操作),所以无论是不是 GC 都使用 drain面试中内存管理,release 和 autorelease 的含义?这里尤其要强调下 autorelease,它引申出自动释放池,也能引申出 Run loop!5. 自动释放池是什么,如何工作 ?当 您

11、向一个对象发送一个 autorelease 消息时,Cocoa 就会将该对象的一个引用放入到最新的自动释放池。它仍然是个对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。 1. Objective-C 是 通过一种“referring counting“(引用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为 1,以后每当碰到有 copy,retain 的时候引用计数都会加 1, 每当碰到 release 和 autorelease 的时候引用计数就会减 1,如果此对象的计数变为

12、了 0, 就会被系统销毁. 2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用自己管理. 3. autorelease 和 release 没什么区别,只是引用计数减 1 的时机不同而已,autorelease 会在对象的使用真正结束的时候才做引用计数减 1. 6. IPhone OS 有没有垃圾回收?autorelease 和垃圾回收制(gc)有什么关系?IPhone OS 中没有垃圾回收 。autorelease 只是延迟释放,gc 是每隔一段时间询问程序,看是否有无指针指向的对象,若有,就将它回收。他们 两者没有什么关系。7. 简述 Notific

13、ationCenter、KVC、KVO、Delegate?并说明它们之间的区别?KVO(Key-Value- Observing):是键值监听,键值观察机制, 当观察者为一个对象的属性进行了注册,被观察对象的 isa 指针被修改的时候,isa 指针就会指向一个中间类,而不是真实的类。所以 isa 指针其实不需要指向实例对象真实的类。所以我们的程序最好不要依赖于 isa 指针。在调用类的方法的时候,最好要明确对象实例的类名KVC(Key-Value-Coding)内部的实现:是键值编码, 一个对象在调用 setValue 的时候, (1)首先根据方法名找到运行方法的时候所需要的环 境参数。 (2

14、)他会从自己 isa 指针结合环境参数,找到具体的方法实现的接口。 (3)再直接查找得来的具体的方法实现。Delegate: 代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate 同意然然后发送者响应事件,delegate 机制使得接收者可以改变发送者的行为。通常发送者和接收者的关系是直接的一对多的关系。Notification: 消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收

15、者的关系是间接的多对多关系。1). 效率肯定是 delegate 比 nsnotification 高。2). delegate 方法比 notification 更加直接,最典型的特征是,delegate 方法往往需要关注返回值,也就是 delegate 方法的结果。比如-windowShouldClose:,需要关心返回的是 yes 还是 no。所以 delegate 方法往往包含 should 这个很传神的词。也就是好比你做我的 delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一步。相反的,notification 最大的特色就是不关心接受

16、者的态度,我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以notification 往往用 did 这个词汇,比如 NSWindowDidResizeNotification,那么nswindow 对象放出这个 notification 后就什么都不管了也不会等待接受者的反应。1)两个模块之间联系不是很紧密,就用 notification 传值,例如多线程之间传值用notificaiton。2)delegate 只是一种较为简单的回调,且主要用在一个模块中,例如底层功能完成了,需要把一些值传到上层去,就事先把上层的函数通过 delegate 传到底层,然后在底层 call 这个 delegate,它们都在一个模块中,完成一个功能,例如说 NavgationController 从 B 界面到 A 点返回按钮 (调用 popViewController 方法) 可以用 delegate 比较好。8. What is lazy loading ? 就是懒汉模式,只在用到的时候才去初始化。也可以理解成延时加载。我觉得最好也最简单的一个列子就是

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

当前位置:首页 > 中学教育 > 试题/考题

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