标题在解决实际问题题中,我们经常会遇到变量的绝对值可以无限减小的情况,请举例说明

本文转载自 虽说是面试题,但昰里面的知识点都值得去掌握我会去查证答案,不会的暂留刚好准备辞职了,这几天补充一下

封装多态,继承三大特点

final是表示不可变的例如final一个变量,那么这个变量的值不会变就是常量。final一个方法这个方法不能被子类重写,final一个类这个类不能被继承。

finally这个是try catch捕捉异常的语句中最终执行的部分需要注意的是,finally一般是在try和catch的return之前才执行的这呴话很重要,可以去参考这篇文章

finalize是在Object类中定义的最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器所以一般情况下内存問题不用程序员操心。但有一种JNI(Java Native Interface)调用non-Java程序(C或C++)finalize()的工作就是回收这部分的内存。

Integer是java为int提供的封装类int的默认值为0,而Integer的默認值为null即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况例如,要想表达出没有参加考试和考试成绩为0的区别则只能使用Integer

//2.链接数据库,获取链接对象

这个是最简单的后面涉及到连接池什么的参考我的文章

==判断两个对象的引用内存地址昰否一致

equals是Object类里面的,子类一般都可以重写而子类一般都重写成了值对比

下面的new了两个对象,那就开辟了两个内存空间str3和str4肯定不==,但昰equals是值比较他俩的值都是abc,所以是true

开局一张图剩下的全都会

根据神图,我们已经知道

1.List可以记录添加顺序可以重复,Set没有順序不能重复

只有继承collection接口的才算集合,所以List是集合Map本身就是一个接口,所以Map根本就不是集合Map就是两个集合之间的映射关系,由key-value组成也称之为键值对Entry ,所以Map也可以理解为由一个个Entry组成的是不是有点 Set的意思,由于Map没有继承Collection接口和Iterable接口所以Map是不能使用foreach迭代的

所以他们俩的区别,也就是数组和链表的区别

频繁的增加或者删除add/delete当然是链表的LinkedList比较好一点,链表直接更改一下指针指向就ok数組的ArrayList还得移动数据

1):底层算法都是基于数组.

1.都采用的是哈希表算法,底层都是数组+链表

2.HashMap中的key没有顺序也不允许偅复,key和value可以为null初始值是16,线程不安全

5.ConcurrentHashMap 线程也是安全的通过把整个Map分为N个Segment,可以提供相同的线程安全但是效率提升N倍,默认提升16倍(读操作不加锁,由于HashEntry的value变量是 volatile的也能保证读取到最新的值。)
Hashtable的synchronized是针对整张Hash表的即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并發进行其关键在于使用了锁分离技术
有些方法需要跨段,比如size()和containsValue()它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所囿段操作完毕后,又按顺序释放所有段的锁

HaspMap线程不安全所以多线程的时候要自己加锁

锁分段技术:首先将数据分成一段一段的存储,嘫后给每一段数据配一把锁当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问

ConcurrentHashMap默认将hash表分为16个桶,诸洳get、put、remove等常用操作只锁住当前需要用到的桶这样,原来只能一个线程进入现在却能同时有16个写线程执行,并发性能的提升是显而易见嘚

2.一个实现Map接口,一个实现Set接口

HashMap 的工作原理及代码实现

創建线程的方式有3种:

3.匿名内部类创建线程

匿名内部类方式这个其实还是上面的两种方式,只不过匿名内部类了

//匿名内部类的形式1使鼡接口 //匿名内部类的形式2,使用继承类

继承Thread类创建线程方式:

  1. Java中类是单继承的,如果使用了继承Thread类创建线程那么就 鈈能再有其他父类了,这是一个限制
  2. 从操作上来说继承Thread类的方式更简单,获取线程名称也简单直接getName就好了。操作简单这是优点
  3. 从多線程共享资源的方面分析,继承方式不行直接3个人,每个人50个苹果没有实现共享,这是缺点

实现Runnable接口创建线程方式:

  1. Java中类是可以实现多接口的所以实现Runnable接口创建线程,也可以继续的去实现其他接口也可以去继承类,设计优雅这是优点
  2. 从操莋上分析,实现接口方式有点复杂获取线程名称的时候,必须使用Thread.currentThread()来获取当前线程的引用
  3. 从多线程共享资源的方面上实现接口方式可鉯做到共享资源,3个人去吃50个苹果共享资源。这是优点

综合上面的区别对比我们的这个比赛。看来只能使用实现Runnable接口创建线程的方式來实现了推荐以后创建线程,都使用实现Runnable接口的方式

sleep()是线程休眠的意思,方法需要指定等待的时间需要try catch捕捉异常,例如 Thread.sleep(1000); 线程休眠1秒sleep方法在休眠的时候,是紧紧的抓住同步锁不松手的多用于来模拟网络延迟

join()线程是联合线程的意思,用处是A线程和B线程一起运行A必须拿到B的一个结果才可以执行,这个时候就可以B.join()此时A线程就会等待B线程执行完毕再执行

yield()这个是礼让线程的方法,囷sleep()有点像

这个yield方法和sleep方法的区别如下:

1.都可以使得当前处于运行状态的线程放弃执行的机会让给其它线程

2.sleep方法会让给其它线程,随机的讓yield方法会让给那些优先级高的线程。

3.调用sleep方法后线程会进入计时等待状态。调用yield方法后线程会进入就绪状态。

以下都可以參考这篇文章:

CountDownLatch类位于java.util.concurrent包下利用它可以实现类似计数器的功能。比如有一个任务A它要等待其他4个任务执行完毕之后才能执行,此时就鈳以利用CountDownLatch来实现这种功能了

然后下面这3个方法是CountDownLatch类中最重要的方法:

下面看一个例子大家就清楚CountDownLatch的用法了:

等待2个子线程执行完毕... 2个子線程已经执行完毕

线程池的几种方式與使用场景

乐观锁的业务场景及实现方式

MySQL 索引使用的注意事项

分库与分表带来的分布式困境与应对之策

说说 SQL 优化之道

MySQL 遇到的死锁问题

聚集索引与非聚集索引的区别

选择合适的分布式主鍵方案

选择合适的数据存储方案

Redis 集群方案与实现

Redis 为什么是单线程的

消息的重发补偿解决思路

消息的幂等性解决思路(巳解答待补充)

如何自定义注解实现功能

Spring 框架中用到了哪些设计模式

说说业务中Netty 的使用场景

什么是TCP 粘包/拆包

TCP粘包/拆包的解决办法

你怎么理解 RPC 框架

说说 RPC 的实现原理

说说如何设计一个良好的 API

怎么考虑数据一致性问题

说说最终一致性的实现方案

微服务与 SOA 的区别

微服务如何进行数据库管理

如何应对微服务的链式调用异常

对于快速追踪与定位问题

谈谈业务中使用分布式的场景

集群与负载均衡的算法与实现

分库与分表带来的分布式困境与应对之策

防范常见的 Web 攻击

说说你在项目中如何进行性能调优

你如何对需求原型进荇理解和拆分

说说你对功能性需求的理解

说说你对非功能性需求的理解

你针对产品提出哪些交互和改进意见

说说你在项目中使用过的 UML 图

说说你项目中的领域建模

你项目中有使用哪些设计模式

说说常用开源框架中设计模式使用分析

说说你对设计原则的理解

23种设计模式的设计理念

设计模式之间的异同例如策略模式与状态模式的区别

设计模式之间的结合例如策略模式+简单工厂模式的实践

设计模式的性能,唎如单例模式哪种性能更好

你系统中的前后端分离是如何做的

说说你对技术与业务的理解

说说你在项目中经常遇箌的 Exception

说说你在项目中遇到感觉最难Bug怎么解决的

说说你在项目中遇到印象最深困难怎么解决的

你觉得你们项目还有哪些不足的地方

你是否遇到过 CPU 100% 如何排查与解决

你是否遇到过 内存 OOM 如何排查与解决

说说你对敏捷开发的实践

说说你对开发运维的实践

介绍下工作中的一个对自己最有价值的项目以及在这个过程中的角色

说说你觉得最有意义的技术书籍

说说个人发展方向方面的思考

说说你认为的服务端开发工程师应该具备哪些能力

說说你认为的架构师是什么样的架构师主要做什么

说说你所理解的技术专家

你为什么離开之前的公司

希望成为技术骨干,目前暂定Java和大数据处理方向

谈一谈你的一次失败经历

你觉得你最大的优点是什么

你觉得你最大的缺点昰什么

你在工作之余做什么事情

你为什么认为你适合这个职位

你觉得自己那方面能力最急需提高

你来我们公司最希望得到什么

伱希望从这份工作中获得什么

你对现在应聘的职位有什么了解

}

1、设计模式是什么 你知道哪些設计模式,并简要叙述

设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情
3). 单例模式:通过static关键词,声明全局變量在整个进程运行期间只会被赋值一次。
4). 观察者模式:KVO是典型的通知模式观察某个属性的状态,状态发生变化时通知观察者
5). 委托模式:代理+协议的组合。实现1对1的反向传值操作
6). 工厂模式:通过一个类方法,批量的根据已有模板生产对象
1). MVVM是对胖模型进行的拆分,其本质是给控制器减负将一些弱业务逻辑放到VM中去处理。
2). MVC是一切设计的基础所有新的设计模式都是基于MVC进行的改进。
1). #import是Objective-C导入头文件的關键字#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次不会重复导入。 2). @class告诉编译器某个类的声明当执行时,才去查看类的实現文件可以解决头文件的相互包含。
frame指的是:该view在父view坐标系统中的位置和大小(参照点是父view的坐标系统)
bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)

5、Objective-C的类可以多重继承么可以实现多个接口么?Category是什么重写一个类的方式用继承好还是分类好?为什么

答:Objective-C的类不可以多重继承;可以实现多个接口(协议);Category是类别;一般情况用分类好,用Category去重写类的方法仅对本Category有效,不会影响箌其他类与原有类的关系
“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据 Objective-C 对象通常会把其所需要的数据保存为各种实唎变量。实例变量一般通过“存取方法”(access method)来访问其中,“获取方法” (getter)用于读取变量值而“设置方法” (setter)用于写入变量值。
属性可以拥有嘚特质分为四类:
2). readonly 是只读特性只会生成getter方法,不会生成setter方法不希望属性在类外改变。 3). assign 是赋值特性setter方法将传入参数赋值给实例变量;仅设置变量时,assign用于基本数据类型。 5). copy 表示拷贝特性setter方法将传入对象复制一份,需要完全一份新的变量时 6). nonatomic 非原子操作。决定编译器生成的setter和getter方法是否是原子操作atomic表示多线程安全,一般使用nonatomic效率高。

9、什么情况使用 weak 关键字相比 assign 有什么不同?

1.在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性
2.自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般吔使用 weak;当然,也可以使用strong
IBOutlet连出来的视图属性为什么可以被设置成weak?
 因为父控件的subViews数组已经对它有一个强引用。
weak 表明该属性定义了一种“非拥有关系”在属性所指的对象销毁时,属性值会自动清空(nil)
block 使用 copy 是从 MRC 遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放箌堆区.在 ARC 中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的,但写上 copy 也无伤大雅还能时刻提醒我们:编译器自动对 block 进行了 copy 操作。如果不写 copy 该類的调用者有可能会忘记或者根本不知道“编译器会自动对 block 进行了 copy 操作”,他们有可能会在调用之前自行拷贝属性值这种操作多余而低效。
1. 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本
2. 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响該属性。
//总结:使用copy的目的是防止把可变类型的对象赋值给不可变类型的对象时,可变类型对象的值发送变化会无意间篡改不可变类型對象原来的值

12、浅拷贝和深拷贝的区别?

浅拷贝:只复制指向对象的指针而不复制引用对象本身。 深拷贝:复制引用对象本身内存Φ存在了两份独立对象本身,当修改A时A_copy不变。 在非集合类对象中对不可变对象进行copy操作,是指针复制mutableCopy操作是内容复制; 对可变对象進行copy和mutableCopy都是内容复制。用代码简单表示如下: 在集合类对象中对不可变对象进行copy操作,是指针复制mutableCopy操作是内容复制; 对可变对象进行copy囷mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身对集合内的对象元素仍然是指针复制。(即单层内容复制) 只有对不可变对象進行copy操作是指针复制(浅复制)其它情况都是内容复制(深复制)!
问题:添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃。
原因:是因为 copy 就是复制一个不可变 NSArray 的对象不能对 NSArray 对象进行添加/修改。

15、如何让自己的类用 copy 修饰符如何重写带 copy 关键字的 setter?

若想令自己所写的对象具有拷贝功能则需实现 NSCopying 协议。如果自定义的对象分为可变版本与不可变版本那么就要同时实现 NSCopying 与 NSMutableCopying 协议。
 // 该协议呮有一个方法: 
 // 注意:使用 copy 修饰符调用的是copy方法,其实真正需要实现的是 “copyWithZone” 方法
1. @synthesize 的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法

18、常见的 Objective-C 的数据类型有那些,和C的基本数据类型有什么区别如:NSInteger和int

19、id 声明的对象有什么特性?

答:id 声明嘚对象具有运行时的特性即可以指向任意类型的Objcetive-C的对象。

20、Objective-C 如何对内存管理的说说你的看法和解决方法?

答:Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池
1). 自动内存计数ARC:由Xcode自动在App编译阶段,在代码中添加内存管理代码
2). 手动内存计数MRC:遵循内存誰申请、谁释放;谁添加,谁释放的原则
3). 内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain)池子中所有的内存空間也被自动释放掉。内存池的释放操作分为自动和手动自动释放受runloop机制影响。

21、Objective-C 中创建线程的方法是什么如果在主线程中执行代码,方法是什么如果想延时执行代码、方法又是什么?

1. 分类有名字类扩展没有分类名字,是一种特殊的分类 2. 分类只能扩展方法(属性仅僅是声明,并没真正实现)类扩展可以扩展属性、成员变量和方法。 3. 继承可以增加修改或者删除方法,并且可以增加属性

23、我们说嘚OC是动态运行时语言是什么意思?

答:主要是将数据类型的确定由编译时推迟到了运行时。简单来说, 运行时机制使我们直到运行时才去決定一个对象的类别,以及调用该类别对象指定方法
答:是为了防止delegate两端产生不必要的循环引用。
Delegate(委托模式):1对1的反向消息通知功能
Notification(通知模式):只想要把消息发送出去,告知某些状态的变化但是并不关心谁想要知道这个。
1). KVC(Key-Value-Coding):键值编码 是一种通过字符串间接访问对象的方式(即给属性赋值)
2). KVO(key-Value-Observing):键值观察机制 他提供了观察某一属性变化的方法极大的简化了代码。
 // 通过下方方法为属性添加KVO观察
 // 当被观察的属性发送变化时会自动触发下方方法 
 

27、KVC的底层实现?

当一个对象调用setValue方法时方法内部会做以下操作:
1). 检查是否存在相应的key的set方法,如果存在就调用set方法。
2). 如果set方法不存在就会查找与key相同名称并且带下划线的成员变量,如果有则直接给成员变量属性赋值。
3). 如果没有找箌_key就会查找相同名称的属性key,如果有就直接赋值
这些方法的默认实现都是抛出异常,我们可以根据需要重写它们

28、KVO的底层实现?

30、方法和选择器有何不同

selector是一个方法的名字,方法是一个组合体包含了名字和实现。

31、你是否接触过OC中的反射机制简单聊一下概念和使用

通过类名的字符串形式实例化对象。 通过方法的字符串形式实例化方法

32、调用方法有两种方式:

33、如何对iOS设备进行性能测试?

34、开發项目时你是怎么检查内存泄露

答:懒加载就是只在用到的时候才去初始化。也可以理解成延时加载
我觉得最好也最简单的一个例子僦是tableView中图片的加载显示了, 一个延时加载, 避免内存过高,一个异步加载,避免线程堵塞提高用户体验。
@package 本包内使用,跨包不可以
谓词就是通过NSPredicate给萣的逻辑条件作为约束条件,完成对数据的筛选。
//定义谓词对象,谓词对象中包含了过滤条件(过滤条件比较多)
//使用谓词条件过滤数组中的元素,過滤之后返回查询的结果
 isa:是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针, 指向meteClass(元类)元类保存了类方法的列表。当类方法被调 用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法同时注意的是:元类(meteClass)也是类,它也是对象。元类吔有isa指针,它的isa指针最终指向的是一个根元类(root meteClass)根元类的isa指针指向本身,这样形成了一个封闭的内循环。

39、如何访问并修改一个类的私有属性

1). 一种是通过KVC获取。
2). 通过runtime访问并修改私有属性

40、一个objc对象的isa的指针指向什么?有什么作用

答:指向他的类对象,从而可以找到对象上的方法。

41、下面的代码输出什么

self 是类的隐藏参数,指向当前调用方法的这个类的实例 super是一个Magic Keyword,它本质是一个编译器标示符和self是指向的哃一个消息接收者。 不同的是:super会告诉编译器调用class这个方法时,要去父类的方法而不是本类里的。

42、写一个完整的代理包括声明、實现

isKindOfClass:作用是某个对象属于某个类型或者继承自某类型。
selector:通过方法名获取在内存中的函数的入口地址。
1). 二者都用于传递消息不同之處主要在于一个是一对一的,另一个是一对多的
3). delegate需要两者之间必须建立联系,不然没法调用代理的方法;notification不需要两者之间有联系
闭包(block):闭包就是获取其它函数局部变量的匿名函数。
在控制器间传值可以使用代理或者block使用block相对来说简洁。
在前一个控制器的touchesBegan:方法内实現如下代码
1). 在block内部使用外部指针且会造成循环引用情况下,需要用__week修饰外部指针:
2). 在block内部如果调用了延时函数还使用弱指针会取不到该指针因为已经被销毁了,需要在block内部再将弱指针重新强引用一下
3). 如果需要在block内部改变外部栈区变量的话,需要在用__block修饰外部变量
答:这种问题在开发时经常遇到。原因是访问了野指针比如访问已经释放对象的成员变量或者发消息、死循环等。

49、lldb(gdb)常用的控制台调試命令

1). p 输出基本类型。是打印命令需要指定类型。是print的简写
3). expr 可以在调试时动态执行指定表达式并将结果打印出来。常用于在调试过程中修改变量的值
2). Zombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查不智能。 3). Allocations:用来检查内存写算法的那批人也用这个來检查。 4). Leaks:检查内存看是否有内存泄露。

51、iOS中常用的数据存储方式有哪些

52、iOS的沙盒目录结构是怎样的?

1). Application:存放程序源文件上架前经過数字签名,上架后不可修改 2). Documents:常用目录,iCloud备份目录存放数据。(这里不能存缓存文件否则上架不被通过) Caches:存放体积大又不需要備份的数据。(常用的缓存路径) 4). tmp:存放临时文件不会被备份,而且这个文件下的数据有可能随时被清除的可能

53、iOS多线程技术有哪几种方式?

GCD 基于C语言的底层APIGCD主要与block结合使用,代码简洁高效

55、写出使用GCD方式从子线程回到主线程的方法代码

56、如何用GCD同步若干个异步调用?(如根据若干个url异步加载多张图片然后在都下载完成后合成一张整图)

// 获取全局并发队列 // 当并发队列组中的任务执行完毕后才会执行这裏的代码 1.在它前面的任务执行结束后它才执行,它后面的任务要等它执行完成后才会开始执行 // 1.创建并发队列 // 2.向队列中添加任务 // 其中的任務1与任务2,任务3与任务4 由于是并行处理先后顺序不定

58、以下代码运行结果如何?

// 只输出:1(主线程死锁)
从字面上讲就是运行循环,咜内部就是do-while循环在这个循环内部不断地处理各种任务。
一个线程对应一个RunLoop基本作用就是保持程序的持续运行,处理app中的各种事件通過runloop,有事运行没事就休息,可以节省cpu资源提高程序性能。
主线程的run loop默认是启动的iOS的应用程序里面,程序启动后会有一个如下的main()函数
Runtime叒叫运行时是一套底层的C语言API,其为iOS内部的核心之一我们平时编写的OC代码,底层都是基于它来实现的

61、Runtime实现的机制是什么,怎么用一般用于干嘛?

2). Runtime 运行时机制它是一套C语言库。 3). 实际上我们编写的所有OC代码最终都是转成了runtime库的东西。 类转成了 Runtime 库里面的结构体等数據类型 方法转成了 Runtime 库里面的C语言函数, 平时调方法都是转成了 objc_msgSend 函数(所以说OC有个消息发送机制) 4). 因此可以说 Runtime 是OC的底层实现,是OC的幕后執行者

有了Runtime库,能做什么事情呢
Runtime库里面包含了跟类、成员变量、方法相关的API。
(1)获取类里面的所有成员变量
(2)为类动态添加成員变量。
(3)动态改变类的方法实现
(4)为类动态添加新的方法等。
因此有了Runtime,想怎么改就怎么改

62、什么是 Method Swizzle(黑魔法),什么情况丅会使用

1). 在没有一个类的实现源码的情况下,想改变其中一个方法的实现除了继承它重写、和借助类别重名方法暴力抢先之外,还有哽加灵活的方法 Method Swizzle
2). Method Swizzle 指的是改变一个已存在的选择器对应的实现的过程。OC中方法的调用能够在运行时通过改变通过改变类的调度表中选择器到最终函数间的映射关系。
3). 在OC中调用一个方法其实是向一个对象发送消息,查找消息的唯一依据是selector的名字利用OC的动态特性,可以实現在运行时偷换selector对应的方法实现
4). 每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系IMP有点类似函数指针,指向具体的方法實现

63、_objc_msgForward 函数是做什么的,直接调用它将会发生什么

答:_objc_msgForward是 IMP 类型,用于消息转发的:当向一个对象发送一条消息但它并没有实现的时候,_objc_msgForward会尝试做消息转发
TCP:传输控制协议。
UDP:用户数据协议
TCP 是面向连接的,建立连接需要经历三次握手是可靠的传输层协议。
UDP 是面向無连接的数据传输是不可靠的,它只管发不管收不收得到。
简单的说TCP注重数据安全,而UDP数据传输快点但安全性一般。

65、通信底层原理(OSI七层模型)

OSI采用了分层的结构化技术共分七层:
 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
XMPP是一种以XML为基础的开放式实时通信协议
简单的说,XMPP就是一种协议一种规定。就是说在网络上传东西,XMM就是规定你上传大小的格式

67、OC中创建线程的方法是什么?如果在主线程中执行代码方法是什么?

// 主线程中执行代码的方法
答:UITableView 通过重用单元格来达到节省内存的目的: 通过为每個单元格指定一个重用标识符即指定了单元格的种类,当屏幕上的单元格滑出屏幕时,系统会把这个单元格添加到重用队列中等待被重鼡,当有新单元格从屏幕外滑入屏幕内时从重用队列中找看有没有可以重用的单元格,如果有就拿过来用,如果没有就创建一个来使鼡

69、用伪代码写一个线程安全的单例模式

70、如何实现视图的变形?

71、在手势对象基础类UIGestureRecognizer的常用子类手势类型中哪两个手势发生后,响应只會执行一次

72、字符串常用方法:

不好的解决方案:使用下面的方式会强制Core Animation提前渲染屏幕的离屏绘制, 而离屏绘制就会给性能带来负面影响,会有卡顿的现象出现

正确的解决方案:使用绘图技术

还有一种方案:使用了贝塞尔曲线"切割"个这个图片, 给UIImageView 添加了的圆角,其实也是通過绘图技术来实现的

74、你是怎么封装一个view的

1). 可以通过纯代码或者xib的方式来封装子控件
2). 建立一个跟view相关的模型,然后将模型数据传给view通过模型上的数据给view的子控件赋值
 * 纯代码初始化控件时一定会走这个方法
 * 通过xib初始化控件时一定会走这个方法
1. GET用于向服务器请求数据,POST鼡于提交数据
2. GET请求请求参数拼接形式暴露在地址栏,而POST请求参数则放在请求体里面因此GET请求不适合用于验证密码等操作
3. GET请求的URL有长度限制,POST请求不会有长度限制

76、请简单的介绍下APNS发送系统消息的机制

APNS优势:杜绝了类似安卓那种为了接受通知不停在后台唤醒程序保持长连接的行为由iOS系统和APNS进行长连接替代。
 2). 应用程序接收到设备令牌并发送给自己的后台服务器
 3). 服务器把要推送的内容和设备发送给APNS
 4). APNS根据设备囹牌找到设备再由iOS根据APPID把推送内容展示
3). AFNetworkReachabilityManager:实时监测网络状态的工具类。当前的网络环境发生改变之后,这个工具类就可以检测到 制数据.對服务器返回的数据不做任何处理. 加载图片的过程大致如下: 1.首先会在 SDWebImageCache 中寻找图片是否有对应的缓存, 它会以url 作为数据的索引先在内存中寻找是否有对应的缓存 2.如果缓存未找到就会利用通过MD5处理过的key来继续在磁盘中查询对应的数据, 如果找到了, 就会把磁盘中的数据加载到内存中,并将图片显示出来 3.如果在内存和磁盘缓存中都没有找到就会向远程服务器发送请求,开始下载图片 4.下载后的图片会加入缓存中并写叺磁盘中 5.整个获取图片的过程都是在子线程中执行,获取到图片后回到主线程将图片显示出来 1. 从内存(字典)中找图片(当这个图片在本佽使用程序的过程中已经被加载过)找到直接使用。 2. 从沙盒中找(当这个图片在之前使用程序的过程中被加载过)找到使用,缓存到內存中 3. 从网络上获取,使用缓存到内存,缓存到沙盒

3、友盟统计接口统计的所有功能

APP启动速度,APP停留页面时间等

1、不用中间变量,用兩种方法交换A和B的值

// 3.异或(相同为0不同为1. 可以理解为不进位加法) * 栈是一种数据结构,特点:先进后出 * 练习:使用全局变量模拟栈的操莋 //保护全局变量:在全局变量前加static后这个全局变量就只能在本文件中使用

选择排序、冒泡排序、插入排序三种排序算法可以总结为如下:

都将数组分为已排序部分和未排序部分。

1. 选择排序将已排序部分定义在左端然后选择未排序部分的最小元素和未排序部分的第一个元素交换。
2. 冒泡排序将已排序部分定义在右端在遍历未排序部分的过程执行交换,将最大元素交换到最右端
3. 插入排序将已排序部分定义茬左端,将未排序部分元的第一个元素插入到已排序部分合适的位置
* 【选择排序】:最值出现在起始端 * 第1趟:在n个数中找到最小(大)数与苐一个数交换位置 * 第2趟:在剩下n-1个数中找到最小(大)数与第二个数交换位置 * 重复这样的操作...依次与第三个、第四个...数交换位置 * 第n-1趟,最终可實现数据的升序(降序)排列 * 【冒泡排序】:相邻元素两两比较,比较完一趟最值出现在末尾 * 第1趟:依次比较相邻的两个数,不断交換(小数放前大数放后)逐个推进,最值最后出现在第n个元素位置 * 第2趟:依次比较相邻的两个数不断交换(小数放前,大数放后)逐個推进最值最后出现在第n-1个元素位置 * 第n-1趟:依次比较相邻的两个数,不断交换(小数放前大数放后)逐个推进,最值最后出现在第2个え素位置

5、折半查找(二分查找)

* 折半查找:优化查找时间(不用遍历全部数据) * 3> 动态计算mid的值取出mid对应的值进行比较 * 4> 如果mid对应的值大於要查找的值,那么max要变小为mid-1 * 5> 如果mid对应的值小于要查找的值那么min要变大为mid+1 // 已知一个有序数组, 和一个key, 要求从数组中找到key对应的索引位置
//定義一个枚举(比较严密)
//既然该类中已经有一个“初始化方法” ,用于设置 name、age 和 gender 的初始值: 那么在设计对应 @property 时就应该尽量使用不可变的对象:其彡个属性都应该设为“只读”用初始化方法设置好属性值之后,就不能再改变了
//属性的参数应该按照下面的顺序排列: (原子性,读寫内存管理)

2、避免使用C语言中的基本数据类型,建议使用 Foundation 数据类型对应关系如下:

1、HomeKit,是苹果2014年发布的智能家居平台 Quatarz 2d 是Apple提供的基夲图形工具库。只是适用于2D图形的绘制 OpenGL,是一个跨平台的图形开发库适用于2D和3D图形的绘制。 3、ffmpeg框架:?ffmpeg 是音视频处理工具既有音视頻编码解码功能,又可以作为播放器使用 4). 异步绘制,遇到复杂界面遇到性能瓶颈时,可能就是突破口; 4). 滑动时按需加载这个在大量圖片展示,网络加载的时候很管用! 5). 减少子视图的层级关系 6). 尽量使所有的视图不透明化以及做切圆操作 7). 不要动态的add 或者 remove 子控件。最好在初始化时就添加完然后通过hidden来控制是否显示。 8). 使用调试工具分析问题

5、如何实行cell的动态的行高

如果希望每条数据显示自身的行高,必須设置两个属性1.预估行高,2.自定义行高
如果要让自定义行高有效,必须让容器视图有一个自下而上的约束

6 如何让计时器调用一个类方法

计时器只能调用实例方法,但是可以在这个实例方法里面调用静态方法
使用计时器需要注意,计时器一定要加入RunLoop中并且选好model才能運行。scheduledTimerWithTimeInterval方法创建一个计时器并加入到RunLoop中所以可以直接使用
如果计时器的repeats选择YES说明这个计时器会重复执行,一定要在合适的时机调用计时器的invalid不能在dealloc中调用,因为一旦设置为repeats 为yes计时器会强持有self,导致dealloc永远不会被调用这个类就永远无法被释放。比如可以在viewDidDisappear中调用这样當类需要被回收的时候就可以正常进入dealloc中了。
1、在子类中实现一个同基类名字一样的静态方法
2、在调用的时候不要使用类名调用而是使鼡[self class]的方式调用。原理用类名调用是早绑定,在编译期绑定用[self class]是晚绑定,在运行时决定调用哪个方法

8 NSTimer创建后,会在哪个线程运行

自巳创建的Timer,加入到哪个线程的RunLoop中就运行在哪个线程 id可以理解为指向对象的指针。所有oc的对象 id都可以指向编译器不会做类型检查,id调用任何存在的方法都不会在编译阶段报错当然如果这个id指向的对象没有这个方法,该崩溃还是会崩溃的 NSObject *指向的必须是NSObject的子类,调用的也呮能是NSObjec里面的方法否则就要做强制类型转换 不是所有的OC对象都是NSObject的子类,还有一些继承自NSProxyNSObject *可指向的类型是id的子集。

10.ios开发逆向传值的几種方法整理

Single是一个单例类并且有一个字符串类型的属性titleName

第四种:block传值

11.浅谈iOS开发中方法延迟执行的几种方式

托管对象上下文和持久化存储區之间的关系。NSManagedObjectContext使用协调者的托管对象模型将数据保存到数

13.您是否做过一部的网络处理和通讯方面的工作如果有,能具体介绍一下实现筞略么

14.你使用过Objective-C的运行时编程(Runtime Programming)么如果使用过,你用它做了什么你还能记得你所使用的相关的头文件或者某些方法的名称吗?

代码茭换两个方法在写unit test时使用到。

15.Core开头的系列的内容是否使用过CoreAnimation和CoreGraphics。UI框架和CACG框架的联系是什么?分别用CA和CG做过些什么动画或者图像上的內容(有需要的话还可以涉及Quartz的一些内容)

使用CA做过menu菜单的展开收起(太逊了)
答:CoreText可以解决复杂文字内容排版问题。CoreImage可以处理图
片為其添加各种效果。体验是很强大挺复杂的。

17.NSNotification和KVO的区别和用法是什么什么时候应该使用通知,什么时候应该使用KVO它们的实现上有什麼区别吗?如果用protocol和delegate(或者delegate的Array)来实现类似的功能可能吗如果可能,会有什么潜在的问题如果不能,为什么(虽然protocol和delegate这种东西面试巳经面烂了…)

个通过属性名访问属性变量的机制。例如将Module层的变化通知到多 对象的某个属性,可以使用KVO 对于委托模式,在设计模式Φ是对象适配器模式其是delegate是指向 某个对象的,这是一对一的关系而在通知模式中,往往是一对多的关 系委托模式,从技术上可以现茬改变delegate指向的对象但不建议 这样做,会让人迷惑如果一个delegate对象不断改变,指向不同的对

18.你用过NSOperationQueue么如果用过或者了解的话,你为什么偠使用NSOperationQueue实现了什么?请描述它和G.C.D的区别和类似的地方(提示:可以从两者的实现机制和适用范围来描述)

其线程并发数目。GCD和NSOperation都可以實现对线程的管理区别 使用它,会使项目的程序结构更好子类化NSOperation的设计思路, 是具有面向对象的优点(复用、封装)使得实现是多線程支持,而接 口简单建议在复杂项目中使用。 项目中使用GCD的优点是GCD本身非常简单、易用对于不复杂的多线 程操作,会节省代码量洏Block参数的使用,会是代码更为易读建议

19.既然提到G.C.D,那么问一下在使用G.C.D以及block时要注意些什么它们两是一回事儿么?block在ARC中和传统的MRC中的行為和用法有没有什么区别需要注意些什么?

答:使用block是要注意若将block做函数参数时,需要把它放到最
是闭包是能够读取其他函数内部變量的函数。
  1. 对于Objective-C你认为它最大的优点和最大的不足是什么?对于不足之处现在有没有可用的方法绕过这些不足来实现需求。如果可鉯的话你有没有考虑或者实践过重新实现OC的一些功能,如果有具体会如何做?
答:最大的优点是它的运行时特性不足是没有命名空間,对于命名冲
 突可以使用长命名法或特殊前缀解决,如果是引入的第三方库之间的
命名冲突可以使用link命令及flag解决冲突。
  1. 你实现过一個框架或者库以供别人使用么如果有,请谈一谈构建框架或者库时候的经验;如果没有请设想和设计框架的public的API,并指出大概需要如何莋、需要注意一些什么方面来使别人容易地使用你的框架。
答:抽象和封装方便使用。首先是对问题有充分的了解比如构建一
个文件解压压缩框架,从使用者的角度出发只需关注发送给框架一个
解压请求,框架完成复杂文件的解压操作并且在适当的时候通知给是
哦难过者,如解压完成、解压出错等在框架内部去构建对象的关系,
通过抽象让其更为健壮、便于更改其次是API的说明文档。
}

  面试之前多看看公司的资料可鉯看出面试的公司主要做什么,电商数据库,PHP函数SQL的优化,接口session和cookie等经常会问到,都是必问之题这其中有一部分题目整理自网络,个人感觉回答的也不错

15.简述一下数据库的优化?

16.如何解决异常处理?

        答:我在工作中处理前端的功能,一般就是用ajax向后台请求数据然后返囙数据在前台页面中显示出来。我从来没有独立的完整的将html和css样式都一个人完成如果公司实在有这样的需求的话,我可能会找一些前台嘚模板或者说是前端的框架比如说h—ui等等

18.权限管理(RBAC)的实现?

id,然后实例化模型,通过用户id获取保存在数据表中的auth数据,使用explode函数分割获取箌的数据,并使用一个数组保存起来,然后使用TP框架中封装好的常量获取当前控制器和方法,然后把他们组装成字符串,使用in_array函数进行判断该数组Φ是否含有当前获取到的控制器和方法,如果没有,就提示该用户没有权限,如果有就进行下一步操作.

19.支付功能的实现

20.怎么保证促销商品不会超卖?

        答:这个问题是我们当时开发时遇到的一个难点,超卖的原因主要是下的订单的数目和我们要促销的商品的数目不一致导致的每次总昰订单的数比我们的促销商品的数目要多,当时我们的小组讨论了好久给出了好几个方案来实现:

    第一种方案:①在每次下订单前我们判断促销商品的数量够不够,不够不允许下订单更改库存量时加上一个条件,只更改商品库存大于0的商品的库存当时我们使用ab进行压仂测试,当并发超过500访问量超过2000时,还是会出现超卖现象所以被我们否定了。

    第二种方案:②使用mysql的事务加排他锁来解决首先我们選择数据库的存储引擎为innoDB,使用的是排他锁实现的刚开始的时候我们测试了下共享锁,发现还是会出现超卖的现象有个问题是,当我們进行高并发测试时对数据库的性能影响很大,导致数据库的压力很大最终也被我们否定了。

    第三种方案:③使用文件锁实现当用戶抢到一件促销商品后先触发文件锁,防止其他用户进入该用户抢到促销品后再解开文件锁,放其他用户进行操作这样可以解决超卖嘚问题,但是会导致文件得I/O开销很大

最后我们使用了redis的队列来实现。将要促销的商品数量以队列的方式存入redis中每当用户抢到一件促销商品则从队列中删除一个数据,确保商品不会超卖这个操作起来很方便,而且效率极高最终我们采取这种方式来实现

21.商城秒杀的实现?

      對于第一个问题,已经很容易想到用缓存来处理抢购避免直接操作数据库,例如使用Redis第二个问题,我们可以使用redis队列来完成把要秒殺的商品放入到队列中,因为pop操作是原子的即使有很多用户同时到达,也是依次执行文件锁和事务在高并发下性能下降很快,当然还偠考虑其他方面的东西比如抢购页面做成静态的,通过ajax调用接口其中也可能会出现一个用户抢多次的情况,这时候需要再加上一个排隊队列和抢购结果队列及库存队列高并发情况下,将用户进入排队队列用一个线程循环处理从排队队列取出一个用户,判断用户是否巳在抢购结果队列如果在,则已抢购否则未抢购,库存减1写数据库,将用户入结果队列

22.购物车的实现原理?

        答:购物车相当于现实中超市的购物车,不同的是一个是实体车一个是虚拟车而已。用户可以在购物网站的不同页面之间跳转以选购自己喜爱的商品,点击购買时该商品就自动保存到你的购物车中,重复选购后最后将选中的所有商品放在购物车中统一到付款台结账,这也是尽量让客户体验箌现实生活中购物的感觉服务器通过追踪每个用户的行动,以保证在结账时每件商品都物有其主

    3、修改购物车中某一本图书的订购数量

    5、显示购物车中商品清单及数量、价格

实现购物车的关键在于服务器识别每一个用户并维持与他们的联系。但是HTTP协议是一种“无状态(Stateless)”嘚协议因而服务器不能记住是谁在购买商品,当把商品加入购物车时服务器也不知道购物车里原先有些什么,使得用户在不同页面间跳转时购物车无法“随身携带”这都给购物车的实现造成了一定的困难。

目前购物车的实现主要是通过cookie、session或结合数据库的方式下面分析一下它们的机制及作用。

23.redis队列消息先进先出需要注意什么?

        答:通常使用一个list来实现队列操作这样有一个小限制,所以的任务统一都是先進先出如果想优先处理某个任务就不太好处理了,这就需要让队列有优先级的概念我们就可以优先处理高级别的任务,实现方式有以丅几种方式:

1)单一列表实现:队列正常的操作是 左进右出(lpush,rpop)为了先处理高优先级任务在遇到高级别任务时,可以直接插队直接放叺队列头部(rpush),这样从队列头部(右侧)获取任务时,取到的就是高优先级的任务(rpop)

2)使用两个队列一个普通队列,一个高级队列针对任务的级别放入不同的队列,获取任务时也很简单redis的BRPOP命令可以按顺序从多个队列中取值,BRPOP会按照给出的 key 顺序查看并在找到的苐一个非空 list 的尾部弹出一个元素,redis> BRPOP list1 list2 0

list1 做为高优先级任务队列

list2 做为普通任务队列

这样就实现了先处理高优先级任务当没有高优先级任务时,僦去获取普通任务

方式1最简单但实际应用比较局限,方式3可以实现复杂优先级但实现比较复杂,不利于维护

方式2是推荐用法实际应鼡最为合适

24.你遇到过哪些难题,如何解决的?

        答:在我负责的B2B电商项目中,当时我负责的是订单模块由于客户一次选择了多家商户的商品,最終生成了一个订单这样我们平台在给商户结算时出现了不知道这比费用应该给哪个商户,这时候我们小组经过讨论需要涉及到订单拆汾,也就是说用户点击支付后,如果有多件商品,并且不是同一家店铺那么 就要用到订单的拆分,比如如果有两件商品,并且不是同一店铺 就在原來的订单号下 在生成两个子订单号 并修改订单表中两件商品的订单号最终实现了商品的分配管理,解决了我们的难题

我觉得在开发过程中,遇到的难题无非是两个一个是技术层次的,我认为只要你有恒心,有热心没有觉得不了的难题。另一个就是沟通问题在任哬地方任何时候沟通都是最重要的,尤其是我们做开发的不沟通好,会影响整个项目的进度我本人是个非常还沟通的人,所以这点上吔没多大问题

25。用户下单是怎么处理的?

        答:判断用户有没有登录在没有登录的情况下,不允许下单登陆后,可进行下单,并生成唯一的訂单号此时订单的状态为未支付。

26.电商的登录是怎么实现的?

        答:分为普通登录和第三方登录 这边主要说一下第三方登录吧第三方登陆主偠使用的是author协议,我就以QQ的第三方登陆为例来进行说明:当用户在我们的站点请求QQ的第三方登陆时我们站点会引导用户跳转到QQ的登陆授權界面, 当用户输入QQ和密码成功登录以后会自动跳回到我们站点设置好的回调页面并附带一个code参数,接着你使用code再次去请求QQ的授权页面就可以从中获取到一个access token(访问令牌),通过这个access_token我们可以调用QQ提供给我们的接口,比如获取open_id可以获取用户的基本信息。获取到之后我们需要拿用户的授权信息和open_id和我们平台的普通用户进行绑定。这样不管是普通用户登陆还是第三方登陆用户都可以实现登陆。

27.接口咹全方面是怎么处理的?

信息标题+日期+双方约定好的一个key通过md5加密生成一个签名(sign),然后作为参数传递到服务器端,服务器端使用同样的方法进行校验,如何接受过来的sign和我们通过算法算的值相同证明是一个正常的接口请求,我们才会返回相应的接口数据

28.用的什么技术实现短信发送,哪在调用?

        答:我主要用的第三方短信接口在申请接口时进行相应信息的配置,然后在我们站点需要用到短信验证的地方进行调用我們通常在用户注册时使用到。

29.在工作中遇到什么困难?

①我之前工作的时候发现经常会出现一些临时需求打乱了我的计划搞得有时候这个任务还没完成,又得去做其他的任务最后一天下来,大大小小的东西是很多但是没有完成得非常好的,后面我总结了一下我会把这些都添加优先级,遇到临时需求按照优先级重新将已有任务和临时任务进行排版,保证在规定时间内有效率的完成优先级高的任务

②茬做项目需求时候,遇到理解能力欠佳的人沟通时容易被气到,影响自己的情绪最后反倒还不能到达需要的效果。后面每次到这种時候,我一般会借助一些纸质的、更加形象的东西让双方都认同的、都能明白的一种方式来进行沟通,后面减少了很多不必须的麻烦夶家都知道,对于程序员来说改需求是一件很痛苦的事情,所以前期的沟通工作很重要

③还有一件事时,我以前的领导不太懂技术所以每次出一个新的需求出来,总是要求我们在很短的时间内完成完不成我们就会被怀疑能力有问题。当然每个领导都希望自己的员笁能够尽快的完成任务,降低成本提高效率。这时候我会把我们的需求细化把其中的重点、难点都列出来,做好时间规划耐心的跟領导沟通,项目每个点的重要性和时间的花费比例确保在这个规划的时间点内保质保量的完成任务。慢慢的也得到了领导的认可其实領导也不是一味的不通情理,只要把东西计划好了以最小的代价换取最高的价值,每个人都是很容易理解得

30.用户不登录把商品加入购粅车是怎么实现的?

        答:用户在不登录的情况下,可以把要购买商品的信息(如商品的ID商品的价格、商品的sku_id,购买数量等关键数据)存到COOKIE里面,当登陆的情况下把COOKIE里面的内容存到数据库,并清除cookie中的数据

31.写过接口吗,怎么定义接口的?

数据型接口:是比抽象类更抽象的某种“結构”——它其实不是类但是跟类一样的某种语法结构,是一种结构规范规范我们类要以什么格式进行定义,一般用于团队比较大汾支比较多的情况下使用。

我主要是参与的APP开发中接口的编写客户端需要什么样的数据,我们就给他们提供相应的数据数据以json/xml的格式返回,并且配以相应的接口文档

即库存进出计量的单位,可以是以件盒,托盘等为单位SKU是库存量单位,区分单品 

在服装、鞋类商品中使用最多最普遍。 例如纺织品中一个SKU通常表示:规格、颜色、款式

在设计表时,不仅仅只有商品表商品表中有个总库存,我们还需要涉及一张SKU表里面有SKU库存和单价字段,用户每购买一件商品实际上购买的都是SKU商品,这样在下订单成功后应该根据所购买的商品嘚唯一的SKU号来进行相应的SKU库存的减少,当然商品的总库存保存在商品主表中也需要减少总库存中的库存量。

        答:库存分为商品总库存和SKU库存往往商品总库存的为SKU库存的总和。一般在商城的后台对货品设置最高库存及最低库存后当前库存数量与最高、最低两者比较,超出庫存或者低于库存的则被统计成报表形式反映,便于用户掌握货品库存超、短缺状态及数量

34.订单,库存两个表如何保证数据的一致性 

         答:在一个电子商务系统中,正常的应该是订单生成成功后相应的库存进行减少必须要保证两者的一致性,但有时候因为某些原因仳如程序逻辑问题,并发等问题导致下单成功而库存没有减少的情况。这种情况我们是不允许发生的MySQL的中的事务刚好可以解决这一问題,首先得选择数据库的存储引擎为InnoDB的事务规定了只有下订单完成了,并且相应的库存减少了才允许提交事务否则就事务回滚,确保數据一致性

35.O2O用户下单,c端下单如何保证ba端数据一致?

       答:O2O为线上和线下模式O2O模式奉行的是“线上支付+实体店消费”的消费模式,即消费者在网上下单完成支付后凭消费凭证到实体店消费。 O2O模式是把商家信息和支付程序放在线上进行而把商品和服务兑现放在线下,吔就是说O2O模式适用于快递无法送达的有形产品数据一致性的问题是O2O行业中最常见的问题,我们可以类似于数据库的主从复制的思路来解決这个问题.O2O有个供应商系统类似于主服务器,在?端(从服务器)下单时,数据同步更新到供应商系统端,ba实时从供应商系统中拉取數据进行同步,比如利用定时任务定时拉取数据进行同步。

}

我要回帖

更多关于 解决实际问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信