@yumewang
2019-02-19T05:40:00.000000Z
字数 17792
阅读 1322
HXWork
10k:没有什么说的
参考:https://www.jianshu.com/p/a2bbd8565a64
DexClassLoader和PathClassLoader,它们都继承于BaseDexClassLoader
。区别在于调用父类构造器时,DexClassLoader多传了一个optimizedDirectory参数,这个目录必须是内部存储路径,用来缓存系统创建的Dex文件。而PathClassLoader该参数为null,只能加载内部存储目录的Dex文件。所以我们可以用DexClassLoader去加载外部的apk。 界面刷新的方式有哪些?
requestLayout,invalidate,postInvalidate区别与联系
相同点:三个方法都有刷新界面的效果。
不同点:invalidate和postInvalidate只会调用onDraw()方法;requestLayout则会重新调用onMeasure、onLayout、onDraw。
调用了invalidate方法后,会为该View添加一个标记位,同时不断向父容器请求刷新,父容器通过计算得出自身需要重绘的区域,直到传递到ViewRootImpl中,最终触发performTraversals方法,进行开始View树重绘流程(只绘制需要重绘的视图)。
调用requestLayout方法,会标记当前View及父容器,同时逐层向上提交,直到ViewRootImpl处理该事件,ViewRootImpl会调用三大流程,从measure开始,对于每一个含有标记位的view及其子View都会进行测量onMeasure、布局onLayout、绘制onDraw。
Binder机制,共享内存实现原理:理解,应用,用处:https://blog.csdn.net/freekiteyu/article/details/70082302
项目上
Activity的启动过程:
app启动的过程有两种情况,
第一种是从桌面launcher上点击相应的应用图标,
第二种是在activity中通过调用startActivity
来启动一个新的activity。
我们创建一个新的项目,默认的根activity都是MainActivity,而所有的activity都是保存在堆栈中的,我们启动一个新的activity就会放在上一个activity上面,而我们从桌面点击应用图标的时候,由于launcher本身也是一个应用,当我们点击图标的时候,系统就会调用startActivitySately()
,一般情况下,我们所启动的activity的相关信息都会保存在intent中,比如action,category等等。我们在安装这个应用的时候,系统也会启动一个PackaManagerService的管理服务,这个管理服务会对AndroidManifest.xml
文件进行解析,从而得到应用程序中的相关信息,比如service,activity,Broadcast等等,然后获得相关组件
的信息。当我们点击应用图标的时候,就会调用startActivitySately()方法,而这个方法内部则是调用startActivty(),而startActivity()方法最终还是会调用startActivityForResult()这个方法。而在startActivityForResult()
这个方法。因为startActivityForResult()方法是有返回结果的,所以系统就直接给一个-1,就表示不需要结果返回了。而startActivityForResult()这个方法实际是通过Instrumentation类中的execStartActivity()方法来启动activity,Instrumentation这个类主要作用就是监控程序和系统之间的交互。而在这个execStartActivity()
方法中会获取ActivityManagerService的代理对象,通过这个代理对象进行启动activity。启动会就会调用一个checkStartActivityResult()
方法,如果说没有在配置清单中配置有这个组件,就会在这个方法中抛出异常了。当然最后是调用的是Application.scheduleLaunchActivity()进行启动activity,而这个方法中通过获取得到一个ActivityClientRecord对象,而这个ActivityClientRecord通过handler来进行消息的发送,系统内部会将每一个activity组件使用ActivityClientRecord对象来进行描述,而ActivityClientRecord对象中保存有一个LoaderApk对象,通过这个对象调用handleLaunchActivity来启动activity
组件,而页面的生命周期方法也就是在这个方法中进行调用。
echart图表实现时,当横轴数据量大时,如何考虑?
实现一个多行文本收折功能,你会细化哪些功能点,那对应的测试点有哪些?
项目中的需求分析,你是如何执行,需要把控什么?会从哪些方面入手?
在什么重要问题上你与其他人有不同看法?
先自我介绍,以及在上一家公司2个项目的工作情况
行业转向考虑到什么,过程中有遇到什么问题,又是怎么克服的?有谁协助过你,或者给予你建议吗?如果是另一个人有你同样的选择,你会如何建议?
未来的规划是什么 洗车
对未来入职的公司要求是什么?
期望的薪资
团队成员-工作态度,工作职责,交流;公司存活,利润,产品
外包-
Android职业-27-35岁,创业-徒步
10k期望,没有波动-管理层,看清现状,人工智能,不考虑后端工程师-技术思维,项目管理:成本,流程控制;
通用面试题
自我介绍
对产品和项目的理解
对工作分解是怎样做
工作中我们最重要的品质是什么,体会最深刻的是什么
当产品设计师需求不断变更,引发的一系列问题,比如计划延期,技术难度,你态度如何?
技术上
a. 对已掌握技术的沉淀方式,和新技术的调研方式
a. 对某个框架(Vue或其他)的理解是什么样的?
a. 对规范的理解,及执行性如何?
a. 最近再了解的新技术是什么?
a. MVC 和 MVVM 的理解
a. ES6 新特性有哪些,请列举说明
a. 一些前端面试题?
a. 代码重构,你的执行思路是什么
a. 代码管理工具Git的理解,工作流程,常用命令
a. Vue的生命周期 https://cn.vuejs.org/v2/api/#%E9%80%89%E9%A1%B9-%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90
以往离职情况,请简要说明
未来的规划是什么
对未来入职的公司要求是什么?
前端库:定制,需要考虑什么,通用组件(个人,更关注技术,而不是团队)
Git
最近再了解的新技术是什么?
代码重构:代码走查?
前端leader:需要考虑什么事情,怎么协调团队过程中的问题,以及过程中的内容
前端Leader:技术,管理,哪个优先级高
产品开放:技术,产品业务?
每个公司是考虑到什么点,选择离职
2007年开始工作,这些考虑?
期望的薪资:???
罗丹
你入职五年,对整个行业的理解,想法是什么?
【较强的组织能力、承压能力、实际动手能力和 团队协作精神,能迅速的适应各种环境】对此请简单以一个事件说明下
你最近读的一本书是什么?
项目周期端,你在每个项目中的状态如何,每个项目个人的成长是什么?
你不是计算机专业的学生,是什么样的契机转为Web前端工程师?
Linux常用命令是什么?
雷燕庭
作为Web前端工程师,你最善长的是那一块?
【熟悉不同内核浏览器差异,并能解决网页在不同浏览器的兼容性问题;】请举例说明
你是云南人,为何选择留在重庆?
【熟悉 w3c 标准,深刻理解 web 标准】能简要说明有哪些标准?
https://www.w3cschool.cn/xuexiw3c/xuexiw3c-standards.html
https://baike.baidu.com/item/WEB%E6%A0%87%E5%87%86/217020?fr=aladdin
项目的搭建及配置,部署
Sublime 常用的快捷命令有哪些?
你对Vue的事件处理的理解:事件修饰符,按键修饰符,系统修饰符,为什么在 HTML 中监听事件? https://cn.vuejs.org/v2/guide/events.html
你个人的兴趣爱好是什么?
项目情况-参与方式
不同项目的参与,你的态度是怎么定义的?
期望薪资9k 12k广东 8k~10k外包 - 4
谈谈你对redis的理解,常用的场景有哪些?
【变得更有耐心,思维更活跃】有哪些方面可以说明这些?
1. 常用的浏览器及使用引擎是什么?
2. 常见http状态码有哪些?
3. CSS的盒模型是什么?
4. CSS都有哪些选择器?它们的优先级是怎么样定义的?
5. 现有前端主流框架有哪些?如何理解它们的架构,使用,及优点缺点。
6. 您知道 ES6 有哪些新特性,请列举说明。
7. 请简略说明 JavaScript 请求跨域原因及其解决方案。
8. for 循环内部 + setinterval()
异步函数集,例如:setTimeout和setInterval。异步函数分类: I/O函数和计时函数。非阻塞式I/O。
for (var i = 1; i <= 3; i++) {
setTimeout(function(){ console.log(i); }, 0);
};
8.
9.
500 : 'Internal Server Error',
403 : 'Forbidden',
404 : 'Not Found',
304 : 'Not Modified',
200 : 'OK',
# => 输出为 4 4 4
1. 项目的基本流程
2. 需求不断变更,UI 严格需求,你的态度如何
3. 开发过程中的,各种冲突,你是如何应对的。可以举例说明吗?
4. 项目过程中,最重要的是什么?
5. 其他,你的优势,缺点?
6. 你未来的期望是何?
7. 你是学的网路工程,如何考虑转向 web 前端
一个优秀的程序员应该具有怎样的技能:
基础扎实,主动思考,爱学习,深度,视野;
正确的人生观和处事态度;
对事有较强的逻辑能力和沟通能力;
发挥稳定的人际整合力;
条理性,逻辑能力,语言能力。
STAR”是SITUATION(背景)、TASK(任务)、ACTION(行动)和RESULT(结果)四个英文单词的首字母组合。仅仅通过应聘者的简历无法全面了解应聘者的知识、经验、技能的掌握程度及其工作风格、性格特点等方面的情况。而使用STAR技巧则可以对应聘者做出全面而客观的评价。
1. 背景(SITUATION):通过不断提问与工作业绩有关的背景问题,可以全面了解该应聘者取得优秀业绩的前提,从而获知所取得的业绩有多少是与应聘者个人有关,多少是和市场的状况、行业的特点有关。
2. 工作任务(TASK): 每项任务的具体内容是什么样的。通过这些可以了解应聘者的工作经历和经验,以确定他所从事的工作与获得的经验是否适合所空缺的职位。
3. 行动(ACTION): 即了解他是如何完成工作的,都采取了哪些行动,所采取的行动是如何帮助他完成工作的。通过这些,可以进一步了解他的工作方式、思维方式和行为方式。
4. 结果(RESULT): 每项任务在采取了行动之后的结果是什么,是好还是不好,好是因为什么,不好又是因为什么。
- 技术上
- 新技术的学习,调研
- 已有技术的沉淀
- 难点攻克?
- 规范
- 工具:代码管理工具(Git常用命令,及工作流程)
- 最近关注或学习的技术是什么
- ES6的了解
- CSS,JS,HTML,Vue
- Nodejs
- 产品,项目
- 平时就事项的工作状况?什么问题?体会最深的地方是什么?
- 小程序开发上问题
- 工作流程?
- 个人:团队,规划,对前端的整体认识
- 离职原因
- 团队上,是如何定义?你觉得你现有可以担当什么角色?
- 对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?
- 个人未来的规划是什么?
- 公司期望????
- 稚嫩
- 现有公司情况(?产品,项目?)
薪资期望(?),及未来的3~5天之内
http://ljinkai.github.io/2015/07/30/front-end-interview/
CSS position定位:static, absolute, relative.
static 默认。它始终会处于页面流给予的位置(static 元素会忽略任何 top、bottom、left 或 right 声明)。
relative 元素可将其移至相对于其正常位置的地方,因此 "left:20" 会将元素移至元素正常位置左边 20 个像素的位置。
absolute 元素可定位于相对于包含它的元素的指定坐标。此元素的位置可通过 "left"、"top"、"right" 以及 "bottom" 属性来规定。
fixed 元素可定位于相对于浏览器窗口的指定坐标。此元素的位置可通过 "left"、"top"、"right" 以及"bottom" 属性来规定。不论窗口滚动与否,元素都会留在那个位置。工作于 IE7(strict 模式)。
您如何实现一个层的定义?
————————————————————————————————————
1.常用的浏览器及使用引擎是什么
2.常见http状态码有哪些
3.CSS的盒模型是什么
4.CSS都有哪些选择器?它们的优先级是怎么样定义的?
javascript对象的几种创建方式
1,工厂模式
2,构造函数模式
3,原型模式
最主要的一点是数据共享,创建对象的时候,我们会把公共的方法和属性挂载到原型上,避免资源浪费。需要注意方法重写?
4,混合构造函数和原型模式
5,动态原型模式
6,寄生构造函数模式
7,稳妥构造函数模式
————————————————————————————————————
5.请简述一下src与href的区别。
5.ES6 新特性有哪些,请列举说明。
7.JavaScript 跨域原因及其解决方案
MVC 和 MVVM 的理解
视图(View):用户界面。
控制器(Controller):业务逻辑
模型(Model):数据保存
接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。
唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember,Vue 都采用这种模式。
代码规范?
注释,CSS,JS,开发流程,代码审查,性能,浏览器测试与支持,项目应用结构,注释等
性能优化方案有哪些?
dns缓存,cdn缓存,浏览器缓存,服务器缓存
(1) 减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器。
(2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
(3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。
(4) 当需要设置的样式很多时设置className而不是直接操作style。
(5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
(6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。
(7) 图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳。
网站重构的理解?
网站重构:在不改变外部行为的前提下,简化结构、添加可读性,而在网站前端保持一致的行为。也就是说是在不改变UI的情况下,对网站进行优化,在扩展的同时保持一致的UI。
对于传统的网站来说重构通常是:
表格(table)布局改为DIV+CSS
使网站前端兼容于现代浏览器(针对于不合规范的CSS、如对IE6有效的)
对于移动平台的优化
针对于SEO进行优化
深层次的网站重构应该考虑的方面
减少代码间的耦合
让代码保持弹性
严格按规范编写代码
设计可扩展的API
代替旧有的框架、语言(如VB)
增强用户体验
通常来说对于速度的优化也包含在重构中
压缩JS、CSS、image等前端资源(通常是由服务器来解决)
程序的性能优化(如数据读写)
采用CDN来加速资源加载
对于JS DOM的优化
HTTP服务器的文件缓存
平时如何管理你的项目?
先期团队必须确定好全局样式(globe.css),编码模式(utf-8) 等;
编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);
标注样式编写人,各模块都及时标注(标注关键样式调用的地方);
页面进行标注(例如 页面 模块 开始和结束);
CSS跟HTML 分文件夹并行存放,命名都得统一(例如style.css);
JS 分文件夹存放 命名以该JS功能为准的英文翻译。
图片采用整合的 images.png png8 格式文件使用 尽量整合在一起使用方便将来的管理。
当问题出现状态时,你觉得在于人,还是事?
对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?
前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近。
1、实现界面交互
2、提升用户体验
3、有了Node.js,前端可以实现服务端的一些事情
前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,
参与项目,快速高质量完成实现效果图,精确到1px;
与团队成员,UI设计,产品经理的沟通;
做好的页面结构,页面重构和用户体验;
处理hack,兼容、写出优美的代码格式;
针对服务器的优化、拥抱最新前端技术。
1. 常用的浏览器及使用引擎是什么
2. 常见http状态码有哪些
3. CSS的盒模型是什么
4. CSS都有哪些选择器?它们的优先级是怎么样定义的?
5. 请简述一下src与href的区别。
6. 现有前端主流框架有哪些?如何理解它们的架构,使用,及优点缺点。
7. ES6 新特性有哪些,请列举说明。
8. JavaScript 跨域原因及其解决方案
9. 什么是异步编程?为什么在 JavaScript 中这么重要?
10. 如何定义一个方法,将 string 的每个字符间加个空格返回。
11. 请用JavaScript实现邮箱验证-正则验证。
12. 请简述您对面向对象的理解,可以有哪些方式来创建对象?
13. JavaScript中,for 循环内部 + setinterval() 输出是什么?
for (var i = 1; i <= 3; i++) {
setTimeout(function(){ console.log(i); }, 0);
};
14. 请根据以下描述,按示例的形式用代码来实现:
小贤是一条可爱的小狗(Dog),它的叫声很好听(wow),每次看到主人的时候就会乖乖叫一声(yelp)。小芒和小贤一样,原来也是一条可爱的小狗,可是突然有一天疯了(MadDog),一看到人就会每隔半秒叫一声(wow)地不停叫唤(yelp)。
原因:
var i的变量的生命周期延伸到了内部函数中
循环结束后,i=4
js事件处理器在线程空闲之前不会运行
setTimeout,延时事件队列,事件循环。延迟执行,永不中断。
iOS应用导航模式有哪些
iOS应用导航模式有哪些
这个问题更多是设计人员考虑的,不过我们也需要了解,不然我们都不知道UITabBarController和UINavigationController等存在的意义是啥。
iOS应用属于客户端应用,问题其实是问下面两个部分:
1:什么是导航模式?客户端导航模式有哪些常见的?
2:iOS中存在哪些导航模式?
导航模式
导航模式:将信息以最优的方式组织起来展现给用户。
客户端常见模式:tab、抽屉、列表、平铺/轮播、宫格和悬浮icon等。
注:不要太在意名称,你会在网上搜到一种模式有多种名称。
ViewController完整生命周期,事件传递链/事件响应链
ViewController完整生命周期
init
loadView
viewDidLoad
viewWillAppear
viewDidAppear
viewWillDisappear
viewDisDisappear
viewWillUnload(Deprecated)
viewDidUnload(Deprecated)
delloc
这里要注意loadView方法,平时我们都没有去管这个事情;
这个方法执行后self.view才有值,也就是说这个方法完成了view的加载,内部会根据控制器名字、是否自己实现、xib等条件来加载view。
如果自己实现loadView方法,并且方法体为空,则self.view为nil,
并且viewDidLoad方法会调用两次;
这说明viewDidLoad是被loadView调起的,在viewDidLoad中如果self.view为nil会再调用一次load
事件传递链/事件响应链
当点击一个按钮的时候,事件如果传递到按钮这个第一响应者上,这就是事件传递链要做的事情。系统根据下面两个方法来传递事件。
//该点是否在本视图点击范围内 point已经被转换了成本视图对应frame- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { //内部实现大概是这样
return CGRectContainsPoint(self.bounds, point);
}//本视图/子视图是否能够传递本事件 point已经被转换了成本视图对应frame- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { //内部实现大概是这样
//用户交互为NO,不处理
if(self.userInteractionEnabled == NO) { return nil;
} if([self pointInside:point withEvent:event]) { NSArray * superViews = self.subviews; //倒序从最上面的一个视图开始查找
for (NSUInteger i = superViews.count; i > 0; i--) { UIView * subview = superViews[i - 1]; //转换坐标系 使坐标基于子视图
CGPoint newPoint = [self convertPoint:point toView:subview]; //得到子视图 hitTest 方法返回的值
UIView * view = [subview hitTest:newPoint withEvent:event]; //如果子视图返回一个view 就直接返回 不在继续遍历
if (view) { return view;
}
} //所有子视图都没有返回 则返回自身
return self;
} return nil;
}
>当点击按钮的时候,其实事件是这样传递的:AppDelegate->UIApplication->UIWindow->xxx->UIViewController->UIView->UIButton。
事件响应链
当找到事件第一响应者之后,该事件如何响应,就是事件响应链要做的事情。
接着上面的例子,UIButton就是系统找出来的第一响应者,那么会执行如下方法:
//触摸事件开始- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}//触摸事件移动- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {}//触摸事件结束- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {}//触摸事件取消- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {}
如果你自己不处理,你可以self.nextResponder让下一个响应者处理。
//触摸事件开始- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //让下一个响应者处理
[self.nextResponder touchesBegan:touches withEvent:event];
}
...
响应者链也就是传递链的倒序。
这里需要注意的就是,如果给UIButton添加了target和UITapGestureRecognizer那么点击按钮只会执行UITapGestureRecognizer,也就是说如果手势和target同时满足条件则只会执行手势。target也是touchesxxx中判定的,你可以重写touchesxxx内部实现为空,你会发现并不影响手势但会影响target。
3. iOS中的定时器UIView/UILayer关系
2. 简单描述一下Runtime,Runtime给类添加属性、成员变量
3. 程序内存分区extern的作用:全局变量·静态变量·局部变量·自动变量(static、extern、全局静态区、堆区、栈区):https://www.jianshu.com/p/797fb0dffc70
4. iOS持久化有哪些
首先这里的持久化指的是数据持久化,目前客户端的持久化也只有这一个含义。
为何要持久化:iOS开发可以没有持久化,持久化更多的是业务需求;比如记录用户是否登陆,下次进应用不需要再登陆。
因为iOS的沙盒机制,所以持久化分为两类:沙盒内和沙盒外。
沙盒内
NSKeyedArchiver
只要遵循了NSCoding协议并正确实现了initWithCoder和encodeWithCoder方法的类都可以通过NSKeyedArchiver来序列化。
归档使用archiveRootObject,解归档使用unarchiveObjectWithFile;需要指定文件路径。
NSUserDefaults
[NSUserDefaults standardUserDefaults]获取NSUserDefaults对象,以key-value方式进行持久化操作。
plist
写入使用writeToFile,读取使用xxxWithContentsOfFile;需要指定文件路径。
数据库
数据库无疑是大量数据最好的持久化方案,数据库目前有:sqlite、CoreData和Realm等。这里就不用回答FMDB它只是封装了sqlite而已。
文件
这里要和plist区分一下,plist方式是字典/数组数据格式写入文件;而这里的文件方式不限数据格式。
沙盒外
KeyChain
沙盒内的方式在应用被删除后数据都会丢失,如果想要不丢失则需要使用KeyChain。
KeyChain本质是一个sqlite数据库,其保存的所有数据都是加密过的。
KeyChain分为私有和公有,公有则需要指定group,一个group中的应用可以共享此KeyChain。
使用KeyChain过程中要理解下面几个问题:
1:自己使用的KeyChain和系统自带的KeyChain数据是隔离的,内部应该是不同数据库文件;
2:KeyChain数据可备份到iCloud中;
3:不需要联网,也不用登陆iCloud账号;一个设备一个sqlite数据库,但是不同应用组不共享数据;
4:要在另一台设备上使用当前设备存储的KeyChain信息,需要当前设备进行数据备份,
再在另一设备上复原数据;比较常用的是iCloud备份方式;
5:系统自带的KeyChain中账号密码分类数据可在系统设置->账号与密码里面看到,
你退出iCloud账号还是存在,只是iCloud会帮你备份如果你设置了的话;这个和照片是一样的道理。
互斥锁:NSLock、pthread_mutex、@synchronized。
加锁后,其他加锁操作阻塞直到解锁。
递归锁:NSRecursiveLock。
一个线程可以多次加锁,相应的要对应多次解锁其他线程才可以加锁。
条件锁:NSCondition、NSConditionLock。
锁满足指定条件时才继续执行,否则阻塞。
信号量:dispatch_semaphore。
wait操作阻塞直到signal被调用。
读写锁:pthread_rwlock。
读模式占有锁时其他线程只能读;写模式占有锁时其他线程不能进行任何操作。
ISO七层协议
应用、表示、会话、传输、网络、数据链路、物理。
TCP/IP四层协议
应用、传输、网络、数据链路。
传输层单位:段;
网络层单位:报;
链路层单位:帧。
使用注意事项
- 访问野指针:数据越界、对象已经释放但对其发送消息等;
- 内存泄漏:循环引用、imageNamed读取图片等;
- 触碰内存峰值:for循环声明变量等;
- 申请了不使用的内存:声明变量但未使用、只在某个逻辑分支用到某些变量但一开始就初始化等。
内存优化- 访问野指针:访问前加判断;
- 这部分问题大多是多线程造成的,比如两个线程同时执行一个方法,方法内部对数组有更新操作。
- 内存泄漏:Instrument Leaks/Allocations检测、使用imageWithContentsOfFile读取图片等;
- imageNamed会缓存加载的图片;imageWithContentsOfFile只是简单的加载图片。
- 触碰内存峰值:手动添加释放池;
- for循环内大量创建局部变量,这些局部变量会等到RunLoop的下一个循环才释放,而手动加入释放池则会提前释放。
- 申请了不使用的内存:懒加载。
1:类指针赋值时只是复制了地址,结构体是复制内容;
2:类不能有同名同参数个数的方法,结构体可以;
3:结构体方法实现编译时就确定了,类方法实现可动态改变;
4:内存分配不一样,结构体在栈,类在堆;
5:结构体可以多重继承,类只能单继承。
Http协议特点,基于Http2.0
快速:协议简单,通讯速度快;
灵活:通过Content-Type可以传递任何类型的数据;
长连接:一次连接处理多个请求,并支持管线(同时发出多个请求,不用等到前面请求响应)、多路复用(一个请求多次响应);
无状态:协议对于事务处理没有记忆能力,如果本次请求需要上次的数据则需要重传。
GET/POST请求区别
GET在URL后以?形式拼接参数,POST将参数放在body中;
GET也可以在body里面放数据,POST也可以在URL放数据,Http只是规定,你也可以不遵守啊。
至于服务器获不获取就看具体实现了。
POST比GET安全,因为GET参数在URL中,用户一眼就能看到;
POST当然也可以用工具看到参数。
语意理解,GET用来获取数据,POST用来上传数据;
客户端和服务器对URL数据一般有1kb的限制。
Http协议对URL并没有限制。
Http是基于Tcp的,而Socket是一套编程接口让我们更方便的使用Tcp/Ip协议;Http是应用层协议,在Tcp/Udp上一层。
1:Http是基于"请求-响应"的,服务器不能主动向客户端推送数据,只能借助客户端请求到后向客户端推送数据,而Sokcet双方随时可以互发数据;
2:Http不是持久连接的,Socket用Tcp是持久连接;
3:Http基于Tcp,Socket可以基于Tcp/Udp;
4:Http连接是通过Socket实现的;
5:Http连接后发送的数据必须满足Http协议规定的格式:请求头、请求头和请求体,而Socket连接后发送的数据没有格式要求。
面向对象原则
单一职责原则,开闭原则,依赖倒置原则(面向接口编程),迪米特原则,里氏替换原则,接口隔离原则。
项目经历,过程中参与的方式,总结点