如何面试app后端开发工程师"知乎

2020-11-21 10:35:40 字数 4871 阅读 6318

1楼:匿名用户

面试题1、python是如何进行内存管理的?python的内存管理主要有三种机制:引用计数机制、垃圾**机制和内存池机制。

a.引用计数当给一个对象分配一个新名称或者将一个对象放入一个容器(列表、元组或字典)时,该对象的引用计数都会增加。当使用del对对象显示销毁或者引用超出作用于或者被重新赋值时,该对象的引用计数就会减少。

可以使用sys.getrefcount()函数来获取对象的当前引用计数。多数情况下,引用计数要比我们猜测的大的多。

对于不可变数据(数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。b.垃圾**当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。

当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。

为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。c.内存池机制python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

1)pymalloc机制。为了加速python的执行效率,python引入了一个内存池机制,用于管理对小块内存的申请和释放。2)python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。

3)对于python对象,如整数,浮点数和list,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。【python环境】12道python面试题总结2、什么是lambda函数?

它有什么好处?lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数lambda函数:首要用途是指点短小的**函数lambda[arguments]:

expression>>>a=lambdax,y:x+y>>>a(3,11)3、python里面如何实现tuple和list的转换?直接使用tuple和list函数就行了,type()可以判断对象的类型。

4、请写出一段python**实现删除一个list里面的重复元素。这个地方用set可以实现。

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

2楼:匿名用户

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)

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)];12

3456

self 拥有_handler, _handler 拥有block, block拥有self(因为使用了self的_data属性,block会copy 一份self)

解决方法:

__weak typedof(self)weakself = self

[ downloaddata:^(id responsedata)];12

346.+(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的一系列方法实现。

web后端开发要考什么证书证书 知乎

3楼:黑马程序员

it行业一般是不看什么证书的,去公司面试的时候都不怎么问证书什么的,主要还是看你技术水平和工作的项目经验。我面试的很多家公司都没有问我要过什么证书,都是问我技术和工作项目经验,所以我也没有考什么证书,我身边做开发的朋友也没有考过证书。

怎么说服面试官会单片机的也能做底层软件开发 知乎

4楼:

高嵌入式开发软硬件都要懂,有的时候还要比较清楚,当然起步价软件比较高,硬件比较低,因为在国内高嵌入式硬件的基本就是抄来抄去的模式,真正投入研发的企业也是有的,但是比较少,因为一款硬件从设计到稳定定型需要投入的比较多周期也比较长,软件就不一样了。但是硬件要是做好了,很吃香,所以嵌入式硬件工程师,要么就是拿初级工程师的薪资,要么就是拿高级工程师的薪资,而嵌入式软件只要你干个两三年,搞的好的话年薪20w不成问题,当然前提是你要干的不错,这个一般就是系统级或者驱动级的那种,还有就是搞软件好找工作,因为需求比较大,而硬件一旦定型,就不会动了。