- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
iOS面试题及详细答案
一、OC基础相关
1.简述OC中的消息机制,和C++的函数调用有什么区别?
答案:OC的消息机制核心是“动态绑定”,具体流程是:
1)编译时,OC会将函数调用转化为objc_msgSend(id,SEL,...)函数的调用,其中id是接收者,SEL是方法选择器(方法名对应的唯一标识);
2)运行时,objc_msgSend会先查找接收者的类对象中的方法列表(缓存优先),找到SEL对应的方法实现(IMP,函数指针);如果没找到,会向上查找父类的方法列表;
3)若最终仍未找到,会触发消息转发机制(resolveInstanceMethod、forwardingTargetForSelector、methodSignatureForSelector+forwardInvocation),如果转发也失败,就会抛出unrecognizedselector异常。
和C++函数调用的区别:
-C++是静态绑定,编译时就确定了要调用的函数地址,直接通过地址调用;OC是动态绑定,编译时只确定要发送的消息,运行时才确定具体的方法实现;
-C++中如果调用了类中不存在的函数,编译阶段就会报错;OC中调用不存在的方法,编译不会报错,运行时才会触发异常(前提是没实现消息转发)。
2.什么是Category?Category能做什么?有哪些局限性?
答案:Category(分类)是OC中用于扩展类功能的机制,允许在不修改原类源码、不创建子类的情况下,为已有类添加方法、属性(仅声明,需手动关联实现)、协议。
主要用途:
1)为系统类(如NSString、UIView)添加自定义方法,比如给NSString添加判断是否为手机号的方法;
2)拆分庞大的类文件,将不同功能的方法分类到不同的Category中,提高代码可读性和维护性;
3)模拟多继承(通过给不同类添加相同协议的Category方法);
4)为类添加私有方法的声明(将私有方法声明在Category中,避免编译警告)。
局限性:
1)不能添加实例变量(成员变量),只能添加属性的声明,需要通过runtime的objc_setAssociatedObject和objc_getAssociatedObject手动关联实现;
2)如果Category中的方法和原类的方法同名,运行时会优先调用Category中的方法(原类方法被“覆盖”,但实际原类方法仍存在,只是调用优先级降低);如果多个Category都实现了同名方法,调用哪个由编译顺序决定(最后编译的Category生效);
3)不能直接覆盖系统类的原有方法(容易导致不可预期的问题,若需修改原有方法逻辑,建议用MethodSwizzling,且要谨慎处理)。
二、Swift相关
1.简述Swift中值类型和引用类型的区别,分别有哪些代表类型?
答案:核心区别是“赋值/传递时是否拷贝数据”:
值类型:赋值或传递时,会创建一个完整的副本(深拷贝,对于复杂值类型可能有写时拷贝优化),修改副本不会影响原对象;内存分配在栈上(部分复杂值类型可能涉及堆),生命周期由系统自动管理,效率较高。
代表类型:结构体(struct,如Int、String、Array、Dictionary、Set)、枚举(enum)、元组(tuple)。
引用类型:赋值或传递时,只传递对象的引用(指针),不拷贝数据,多个引用指向同一个对象;修改其中一个引用的对象内容,会影响所有指向该对象的引用;内存分配在堆上,需要通过引用计数(ARC)管理生命周期,存在循环引用的风险。
代表类型:类(class)、闭包(closure)、函数(function,Swift中函数是引用类型)。
2.Swift中如何解决闭包的循环引用问题?
答案:循环引用产生的原因是:闭包会默认捕获其作用域内的变量/常量,若闭包和被捕获的对象互相持有(比如对象持有闭包,闭包又捕获了对象self),就会导致双方引用计数都无法归零,从而产生内存泄漏。
解决方法主要有3种,核心是打破“互相持有”的关系:
1)弱引用(weak):用于被捕获对象可能为nil的场景(非可选类型的self也可使用,捕获后变为可选类型)。语法:在捕获列表中声明weakvarself=self(或weaklet)。
示例:
classPerson{
varname:String
varclosure:(()-Void)?
init(name:String){=name}
deinit{print(\(name)被销毁)}
}
letperson=Person(name:张三)
person.closure={
您可能关注的文档
最近下载
- 大规模语言模型在高校辅导员工作中的应用.docx VIP
- 行政事业单位预算编制存在的问题及对策.docx VIP
- 基于mRNA技术疫苗生产现场检查手册.doc VIP
- 行政事业单位常见内控风险点.pdf VIP
- 九年级上下册化学方程式及实验现象(全).doc VIP
- 2025年全国农产品质量安全检测技能竞赛理论知识考试题库(含答案).docx VIP
- 国开电大本科《工程经济与管理》期末考试第四大题计算题题库.docx VIP
- 中国慢性阻塞性肺疾病基层诊疗与管理指南(2024年)解读 (1)PPT课件.pptx VIP
- 最新初中生物新课标《义务教育生物学课程标准(2022-年版)》学习解读PPT课件.pptx VIP
- 农产品质量安全检测竞赛考试题库资料(含答案).docx VIP
原创力文档


文档评论(0)