问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

知乎上的一个怎么面试iOS工程师的问题

发布网友 发布时间:2022-04-29 14:20

我来回答

1个回答

热心网友 时间:2023-10-10 07:58

1.什么是arc?(arc是为了解决什么问题诞生的?)
首先解释ARC: automatic reference counting自动引用计数。
ARC几个要点:
在对象被创建时 retain count +1,在对象被release时 retain count -1.当retain count 为0 时,销毁对象。
程序中加入autoreleasepool的对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁。
那么ARC是为了解决什么问题诞生的呢?这个得追溯到MRC手动内存管理时代说起。
MRC下内存管理的缺点:
1.当我们要释放一个堆内存时,首先要确定指向这个堆空间的指针都被release了。(避免提前释放)
2.释放指针指向的堆空间,首先要确定哪些指针指向同一个堆,这些指针只能释放一次。(MRC下即谁创建,谁释放,避免重复释放)
3.模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁去释放。
4.多线程操作时,不确定哪个线程最后使用完毕
2.请解释以下keywords的区别: assign vs weak, __block vs __weak
assign适用于基本数据类型,weak是适用于NSObject对象,并且是一个弱引用。
assign其实也可以用来修饰对象,那么我们为什么不用它呢?因为被assign修饰的对象在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil。如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。
而weak修饰的对象在释放之后,指针地址会被置为nil。所以现在一般弱引用就是用weak。
首先__block是用来修饰一个变量,这个变量就可以在block中被修改(参考block实现原理)
__block:使用__block修饰的变量在block代码快中会被retain(ARC下,MRC下不会retain)
__weak:使用__weak修饰的变量不会在block代码块中被retain
同时,在ARC下,要避免block出现循环引用 __weak typedof(self)weakSelf = self;
3.__block在arc和非arc下含义一样吗?
是不一样的。
在MRC中__block variable在block中使用是不会retain的
但是ARC中__block则是会Retain的。
取而代之的是用__weak或是__unsafe_unretained来更精确的描述weak reference的目的
其中前者只能在iOS5之後可以使用,但是比较好 (该物件release之後,此pointer会自动设成nil)
而後者是ARC的环境下为了相容4.x的解决方案。
所以上面的范例中
__block MyClass* temp = …; // MRC环境下使用
__weak MyClass* temp = …; // ARC但只支援iOS5.0以上的版本
__unsafe_retained MyClass* temp = …; //ARC且可以相容4.x以後的版本
4.使用nonatomic一定是线程安全的吗?()
不是的。
atomic原子操作,系统会为setter方法加锁。 具体使用 @synchronized(self){//code }
nonatomic不会为setter方法加锁。
atomic:线程安全,需要消耗大量系统资源来为属性加锁
nonatomic:非线程安全,适合内存较小的移动设备
5.描述一个你遇到过的retain cycle例子。
block中的循环引用:一个viewController
@property (nonatomic,strong)HttpRequestHandler * handler;
@property (nonatomic,strong)NSData *data;
_handler = [httpRequestHandler sharedManager];
[ downloadData:^(id responseData){
_data = responseData;
}];
1
2
3
4
5
6
self 拥有_handler, _handler 拥有block, block拥有self(因为使用了self的_data属性,block会copy 一份self)
解决方法:
__weak typedof(self)weakSelf = self
[ downloadData:^(id responseData){
weakSelf.data = responseData;
}];
1
2
3
4
6.+(void)load; +(void)initialize;有什么用处?
在Objective-C中,runtime会自动调用每个类的两个方法。+load会在类初始加载时调用,+initialize会在第一次调用类的类方法或实例方法之前被调用。这两个方法是可选的,且只有在实现了它们时才会被调用。
共同点:两个方法都只会被调用一次。
7.为什么其他语言里叫函数调用, objective c里则是给对象发消息(或者谈下对runtime的理解)
先来看看怎么理解发送消息的含义:
曾经觉得Objc特别方便上手,面对着 Cocoa 中大量 API,只知道简单的查文档和调用。还记得初学 Objective-C 时把[receiver message]当成简单的方法调用,而无视了“发送消息”这句话的深刻含义。于是[receiver message]会被编译器转化为:
objc_msgSend(receiver, selector)
如果消息含有参数,则为:
objc_msgSend(receiver, selector, arg1, arg2, ...)
如果消息的接收者能够找到对应的selector,那么就相当于直接执行了接收者这个对象的特定方法;否则,消息要么被转发,或是临时向接收者动态添加这个selector对应的实现内容,要么就干脆玩完崩溃掉。
现在可以看出[receiver message]真的不是一个简简单单的方法调用。因为这只是在编译阶段确定了要向接收者发送message这条消息,而receive将要如何响应这条消息,那就要看运行时发生的情况来决定了。
Objective-C 的 Runtime 铸就了它动态语言的特性,这些深层次的知识虽然平时写代码用的少一些,但是却是每个 Objc 程序员需要了解的。
Objc Runtime使得C具有了面向对象能力,在程序运行时创建,检查,修改类、对象和它们的方法。可以使用runtime的一系列方法实现。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? windes10什么开启 IIs 哪位网友有新龙门客栈(1992)由李惠民导演的在线观看的百度云视频链接地址 北京最厉害的刑事律师是谁? 请问大佬有卓别林1992年上映的由小罗伯特·唐尼主演的高清视频在线观看资源吗 求龙腾四海(粤语二)(1992)刘德华,任达华主演的高清视频免费观看资源 求黄飞鸿之三狮王争霸黄飞鸿之三狮王争霸 (1992)主演李连杰,关之琳的高清视频免费观看资源 听说北京银雷律师事务所打刑事官司口碑好?哪个律师牛一些? 摩托罗拉手机是哪个国家的? 求力王(1992)由蓝乃才导演的在线观看的百度云视频链接地址分享一下 跪求*大亨之新哥传奇(1992)万梓良,邱淑贞主演的高清视频在线观看地址 请问大佬有红猪1992年由 森山周一郎主演的高清视频在线观看资源吗 跪求庙街十二少(1992)主演刘德华,王祖贤的在线免费高清播放视频 支付宝消息被拒收,也看不到对方真实姓名,是不是已经被删除好友? 给对方支付宝发消息,本机不显示消息已发送,或对方已拒收,是啥情况? 请问大佬有1992年上映的由韦斯利·斯奈普斯主演的巡弋悍将高清视频在线观看资源吗 哪位大神有辣手神探(1992)年上映的由周润发等主演的高清视频免费观看资源链接 支付宝消息拒收是不是被删了 摩托罗拉哪去了 这些年没再见过摩托罗拉手机 oppo手机各系列的定位和特点 支付宝信息对方怎么情况下拒收信息 如今开家具店能赚钱吗? 开个家居饰品店挣钱吗 家居饰品的市场前景怎样? 家居饰品市场如何?利润怎么样?还有进货要注意什么事项? 想做家居饰品店,不知道利润空间怎么样? 家居饰品这个行业前景怎么样? 家居饰品,家居装饰这类的生意未来发展前景怎么样? 开家具店赚钱吗 家居饰品前景如何? 家居饰品的行业前景怎样呀? 关于已开家居饰品店和预开家居饰品店如何进货问题 我想开个家具店,又不知道能不能赚钱? 有开过生活家居用品的朋友么?透漏下收入怎么样. 小天才z1,隐藏功能 请问新买的紫砂杯先前要怎样才可以用 从事程序员有什么好处和劣势 新买的紫砂杯正确的开杯方法 紫砂茶杯,喝之前要怎么处理? 海大集团硕士待遇 新买来的紫砂壶要怎么保养