- 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笔试题及答案
一、基础概念题
Swift中值类型和引用类型的核心区别是什么?请各举2个常见例子,并说明实际开发中如何避免因类型特性导致的问题。
答案:
核心区别:值类型赋值时拷贝完整数据(数据独立),引用类型赋值时仅传递内存地址(数据共享)。
例子:值类型(Int、Array,注:Array虽为结构体,但存大量数据时拷贝会影响性能);引用类型(UIViewController、NSDictionary)。
避坑场景:①传递大数组时,用inout关键字减少拷贝(仅需修改时用),或改用NSMutableArray(需注意线程安全);②引用类型传递时,若需独立数据,需手动实现深拷贝(如NSDictionary的copy是浅拷贝,深拷贝需遍历子元素复制)。
OC中KVC和KVO的实现原理是什么?实际开发中使用KVO时,容易出现哪些问题?如何解决?
答案:
原理:KVC通过setValue:forKey:遍历accessInstanceVariablesDirectly允许的成员变量(如_key、_isKey、key、isKey)赋值;KVO基于Runtime动态生成子类,重写被观察属性的setter方法,触发observeValueForKeyPath:ofObject:change:context:。
常见问题:①忘记移除观察者(导致野指针崩溃);②多个观察者监听同一属性时,context参数未区分(导致回调混淆);③观察集合类(如NSMutableArray)时,直接调用addObject:不触发KVO。
解决:①在dealloc中调用removeObserver:forKeyPath:context:,或用[NSObjectcancelPreviousPerformRequestsWithTarget:self]兜底;②定义唯一staticvoid*类型的context区分观察者;③集合类需通过KVC方法(如mutableArrayValueForKey:)修改数据。
二、内存管理题
ARC下,循环引用的产生条件是什么?请举1个实际开发中的场景(如网络请求回调),并写出3种解决方案。
答案:
产生条件:两个或多个对象互相强引用(retaincycle),导致引用计数无法归0,无法被系统回收。
场景:ViewController中创建NetworkManager,NetworkManager的回调block引用self,同时self强引用NetworkManager。
//循环引用代码
@interfaceViewController()
@property(nonatomic,strong)NetworkManager*manager;
@end
@implementationViewController
-(void)viewDidLoad{
[superviewDidLoad];
self.manager=[[NetworkManageralloc]init];
[self.managerrequestData:^(iddata){
self.label.text=data;//block强引用self,self强引用manager
}];
}
@end
解决方案:
①弱引用(weak):__weaktypeof(self)weakSelf=self;,block内用weakSelf;
②无主引用(unowned):若self一定不先于block释放(如单例回调),用__unownedtypeof(self)unownedSelf=self;;
③打破强引用:请求结束后手动置空self.manager=nil。
autoreleasepool的作用是什么?实际开发中,哪些场景下必须手动创建autoreleasepool?
答案:
作用:管理autorelease对象的生命周期,当pool销毁时,会向池内所有对象发送release消息,避免内存堆积。
必须手动创建的场景:①循环创建大量临时对象(如for循环生成10000个UIImage),不创建pool会导致内存峰值过高;②子线程中执行耗时操作且产生autorelease对象(子线程默认无autoreleasepool,不手动创建会导致内存泄漏)。
三、UI与布局题
UIKit中,为什么不建议在子线程更新UI?是否存在例外情况?请说明原理。
答案:
不建议原因:UIKit框架非线程安全,UI控件的属性(如f
文档评论(0)