iOS程序员面试分类模拟6.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

iOS程序员面试分类模拟6

简答题

1.?类别与其他特性(类扩展和继承)有什么区别?

正确答案:

类别(Category)与继承(Inheritance)的区别如下:

??1)子类继承是进行类扩展的另一(江南博哥)种常用方法,当然基于子类继承的扩展更加自由、正式,既可以新增属性,也可以新增方法。类别可以在不获悉、不改变原来代码的情况下往里面添加新的方法,但也只能添加方法,不能添加属性,属于功能上的扩展。类别扩展的优点是不需要创建一个新的类,而是在系统中已有的类上直接扩展、覆写,不需要更改类就可以添加并使用扩展方法。

??2)相对于子类继承扩展,类别的另一明显优势就是实现了功能的局部化封装,扩展的功能只会在本类被引用时看到。例如,假设原类为UIButton,现在要使用类别扩展一些用于模块A的方法,那么这些扩展方法就可以定义在一个叫作UIButton+A.h的头文件中,只有在引用UIButton+A.h的地方,才能看到模块A添加的那些扩展方法,如果不需要模块A的功能,那么不引用UIButton+A.h头文件就看不到UIButton的那些扩展方法,实现扩展模块的隔离。

??类别与类扩展的区别如下:

??类别和类扩展的明显区别在于,类扩展可以添加属性。另外,类扩展添加的方法是必须要实现的。类扩展可以认为是一个私有的匿名的类别,因为类扩展定义在.m文件头部,添加的属性和方法都没有暴露在头文件,所以在不考虑运行时特性的前提下这些扩展属性和方法只能在类内部使用,一定程度上可以说是实现了私有的机制。

?

2.?Objective-C中类别特性的作用及其局限性是什么?

正确答案:

Objective-C中类别特性的作用如下:

??1)可以将类的实现分散到多个不同文件或多个不同框架中(扩充新的方法)。

??2)可以创建对私有方法的前向引用。

??3)可以向对象添加非正式协议。

??Objective-C中类别特性的局限性如下:

??1)类别只能向原类中添加新的方法,且只能添加而不能删除或修改原方法,不能向原类中添加新的属性。

??2)类别向原类中添加的方法是全局有效的而且优先级最高,如果和原类的方法重名,那么会无条件覆盖掉原来的方法,造成难以发现的潜在危险。因此,使用类别添加方法一定注意保证是单纯的添加新方法,避免覆盖原来的方法(可以通过添加该类别的方法前缀来防止冲突)。例如,在多人协作开发的过程中,如果团队中有人在其他成员不知情的情况下使用类别将类中的方法覆盖了,那么这会使得项目在运行时出现意想不到的问题,并且难以发现和纠正问题。

?

3.?类别和类扩展如何使用?

正确答案:

类别和类扩展的区别已经讨论过了,最明显的是类别中不可以添加新属性而类扩展中可以添加属性。类别的使用方法很简单,就是新建某个类的类别扩展文件,然后添加新的方法。而类扩展并不常用,只是常用在.m文件中的头部进行头文件的私有属性变量补充,也就是所谓的类的Continuous区域,是将不想暴露给外部的一些变量定义在类扩展中。

??1.创建类别或类扩展文件

??首先为工程添加新文件,并选择文件类型为Objective-CFile,如图所示。

??

??选择Objective-CFile

??然后填写自定义的扩展名,然后选择文件类型,这里选择Category或者Extension,最后选择要扩展的已有类,如图所示。

??

??设置新建的类别文件

??创建之后就可以得到对应的类别文件了,如图所示。

??

??类别文件

??2.添加新的扩展方法

??这里以扩展NSString类的方法为例展示类别扩展的具体用法,分别添加一个类方法和实例方法,并调用。

??类别头文件方法声明:

??/*NSString+Category.h*/

??#import<Foundation/Foundation.h>

??@interfaceNSString(Category){

??/*不可以添加实例变量,编译器会直接报错!*/

??}

??/*实例变量被禁止,此处添加属性变量足无意义的,定义的新属性,编译器没有实现存取方法,自己也无法手动实现存取方法,因为无法获取加下画线的实例变量,除非利用运行时强行实现存取方法才可以成功为类别添加属性,代价较高*/

??//@property(nonatomic,copy)NSString*newStving;

??/*扩展一个类方法*/

??+(void)categoryClassMethodOtString;

??/*扩展一个实例方法*/

??-(void)categoryInstanceMethodOfString;

??@end

??类别方法的实现(类别的方法可以不实现

文档评论(0)

江南博哥 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档