项目开发
1.登陆与后台的交互判断(token)
ios的服务器端提供的对外访问的接口。不能像Web服务器开发那样使用session会话来保存一个用户的登录状态。所以为了接口访问的安全考虑,在请求接口返回数据之前在服务器端做一些安全的认证。目前有一些解决方案,如使用OAuth2.0,或自定义一些访问策略,有的正如你说使用token的方式,还有就是在发请求时,将使用用户的信息通过请求头httpHeader来发送到服务器端。这些方式都是可以的。
用户登录以后,后台会返回一个token这个token包含了很多信息,比如登录时间 ,设备信息,账号信息等。每次访问后台其他API的时候带上这个token,后台会对这个信息判断,比如是否登录超时了,登录设备信息改变了等待。
2.购物车的实现原理
实现购物车的关键在于服务器识别每一个用户并维持与他们的联系。但是HTTP协议是一种“无状态(Stateless)”的协议,因而服务器不能记住是谁在购买商品,当把商品加入购物车时,服务器也不知道购物车里原先有些什么,使得用户在不同页面间跳转时购物车无法“随身携带”,这都给购物车的实现造成了一定的困难。
目前购物车的实现主要是通过cookie、session或结合数据库的方式。
http://wenku.baidu.com/link?url=5axqoFQjP5FjlpNHAH9_IDsLCb5OjZasva8UW6L67Z9fFeaD3Wm3pjb_sLSD_X8c8Wb5gqFZGMDwYlqW_XjGmXFSAEiCYaPP0JPZva0WxUy
iOS实现一个类似电商购物车界面示例
http://www.open-open.com/lib/view/open1429836272963.html
1、列举一下你使用过的客户端安全保密性措施?
(1)代码混淆
(2)客户端数据加密,常用加密算法有:DES、AES、MD5、RSA、双钥加密、非对称加密;
(3)使用https进行数据传输
6、请罗列几种调试程序的方法和工具。
调试程序的方法:
1、添加断点
(1)普通操作:添加断点,不分Debug模式和Run模式的,如果创建了断点并且运行到断点处,面板就自动进入Debug模式,在这里可以看到模拟器或者手机的系统运行情况,以及改断点在线程队列中的位置
(2)添加全局断点
有时候在程序出错的时候不能能准确定位到奔溃的那一行代码,而是直接跑到main循环或者Appdelegate里面,建立了全局断点,这样只要遇到错误,debug程序就会自动定位到栈底的信息,也就是你最先出错的代码的那一行。
(3)添加条件断点
可以在你断点的位置,执行各种操作,比如执行脚本命令,控制台命令(可以制定调试信息自定义保存)、打印信息等
2、使用NSLog打印
3、开启僵尸对象
Xcode可以把那些已经release掉得对象,变成“僵尸”,当我们访问一个Zombie对象时,Xcode可以告诉我们正在访问的对象是一个不应该存在的对象了。因为Xcode知道这个对象是什么,所以可以让我们知道这个对象在哪里,以及这是什么时候发生的。
4、使用Console(lldb命令)
lldb真的很强大,各种断点,各种打印,调用python插件,运行中断,操作硬件底层,控制程序运行线程等调试技巧lldb都可以实现。
程序BUG测试工具
Analyze
analyze可以快速的发现你的代码中release的问题,以及继承过程中的父类方法缺失等等问题。
Instrument (Time Profiler, Allocations, Leaks)
instrument里面包含了很多工具,内存溢出分析,性能分析,各种分析…… 专用debug的内存溢出分析工具
Debug View Hierarchy
单元测试
Charles
Jenkins
7.轮播图怎么实现的
(1)主要实现思路是:根据图片总数及宽高设置好ScrollView的大小,每切换一张图片相当于在ScrollView上进行一个图片宽度的移动行为,并加入定时器,实现自动轮播。
http://www.tuicool.com/articles/reu22eu
(2)实现步骤
1,在一个uiscrollerview中,按需添加uiimageview
2,按照uiimageview的数量定制一个uipagecontroller,添加到uiscrollerview
3,对每张图片添加左右滑动事件
4,当滑动时更新uipagecontroller的指示,当滑动到首尾两张图片时,要做特殊处理,以便 继续滑动时看起来像是倒回去了
5,如果是要做成第三方库的话再实现一个委托,这样可以通过协议给代理传输一些值,跟踪用户当前滑动到了那一张,向哪边滑动,点击了哪张图片,以便进行后续操作。
1.徽标识(你的手机下载过一个APP,然后删除了,服务器记录了你下载过这个APP)
答案: UUID+keychain,
UUID获取方法:
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
NSString *uuid = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));
//新的UUID生成,随机生成,用于唯一标识,需要保存
-(NSString*) uuid {
CFUUIDRef puuid = CFUUIDCreate( kCFAllocatorSystemDefault );
CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);
CFRelease(puuid);
CFRelease(uuidString);
return [result autorelease];
}
用keychain保存一下
[参考链接](http://blog.sina.com.cn/s/blog_5971cdd00102vqgy.html)
26.你的项目日活量是多少?
日活量是活跃量也就是本款软件的使用热度,日活跃用户的数量
第一题:之前做过什么类型的APP,后台是什么语言
PHP.JAVA
第三题:谈一谈你是怎么封装view的
第五题:客户端app将登陆后的信息存储在哪里
第七题:UITextField的代理方法,怎么处理输入文本框被键盘遮挡(具体代码)
//开始编辑输入框的时候,软键盘出现,执行此事件
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
CGRect frame = textField.frame;
int offset = frame.origin.y + 32 - (self.view.frame.size.height - 216.0);//iPhone键盘高度216,iPad的为352
[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:0.3f];
//将视图的Y坐标向上移动offset个单位,以使下面腾出地方用于软键盘的显示
if(offset > 0)
self.view.frame = CGRectMake(0.0f, -offset, self.view.frame.size.width, self.view.frame.size.height);
[UIView commitAnimations];
}
//当用户按下return键或者按回车键,keyboard消失
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
//输入框编辑完成以后,将视图恢复到原始状态
-(void)textFieldDidEndEditing:(UITextField *)textField
{
self.view.frame =CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
}
第八题:做好的APP测试怎么给客户看(假如客户在上海你在北京)
把做好的APP打包发送给客户进行测试。
ios打包ipa的四种实用方法(.app转.ipa)
http://www.cnblogs.com/wengzilin/p/4601684.html
25.iOS上传文件怎么弄的有那些细节要注意的?
第十五题:如何处理后台返回的列表中有100条数据的
按照实际需求处理成模型数组
第十八题:在你的开发项目中觉得比较难做的是哪一块,最后怎么解决的!
(1)根据后台接口请求数据,对数据进行模型化处理。
根据接口的数据以及界面需要显示的需求进行分析。
(2)项目的内存优化问题。
内存优化有很多方法,之前的题目有具体分分析,可以参考。
(3)重用问题,例如tableViewCell的重用。
可以根据自己的项目具体分析,有什么难点,自己的解决办法。
第十七题:你在你们的项目中,登陆注册会做吗,怎么做的?
1即时通讯类做过没有,开发中遇到那些问题难点?
(1)xmppFramework相互添加好友的问题
(2)有即时通信的应用需要在苹果测是的过程中对其编码进行回话.否则就会导致审核失败.
(3)通讯过程中怎样实现表情,图片,语音信息的发送问题,可以将文件编码,转换成BASE64传送
(4)app无法收到推送的问题
常见问题可以在第三方的开发文档中去找,里面会有一些常见问题以及解决办法
3会绘制曲线图么,类似股市那个曲线图,会就说一说思路?
(1)使用Core Plot
http://blog.csdn.net/kesalin/article/details/8758791
Core Plot和s7Graph都是可在iOS平台下使用的开源矢量图形库,Core Plot功能强大很多,我们可以利用它很方便地画出复杂的曲线图、柱状图和饼图等等。
a)在CPTGraphHostingView上放置一个xy轴图CPTXYGraph;b)然后对xy轴图进行设置,设置其主题,可视空间CPTPlotSpace,以及两个轴CPTXYAxis;c)然后在xy轴图上添加红蓝渐变的曲线图CPTScatterPlot;d)然后在xy轴图上添加绿色破折线曲线图CPTScatterPlot;
e)最后,实现数据源代理方法,添加数据源。
(2)IOS使用CGContextRef画折线图
在drawRect方法中进行绘制
首先获取当前的上下文,根据数据确定在坐标系中对应的点的位置,使用CGContextMoveToPoint添加起点,
使用CGContextAddLineToPoint添加终点,最后使用CGContextStrokePath函数进行画线,依次连接各点。
开发中遇到的问题:
(1)支付宝支付时,提示“ALI69”,“ALI64”?一般是因为RSA公钥不正确或未上传导致的。解决方法:在支付宝商家服务平台检查RSA公钥是否生成错误或者没上传。
(2)BCPayExample中支付宝支付,跳转到支付后提示“系统繁忙”?由于支付宝政策原因,故不再提供支付宝支付的测试功能,请在BeeCloud平台配置正确参数后,使用自行创建的APP的appID和appSecret。给您带来的不便,敬请谅解。
(3)在iPhone上未安装支付宝钱包客户端的情况下,APP内发起支付宝支付,会是怎么样的?正常情况下,会跳到支付宝网页收银台。如果你是从webview发起的支付请求,则不会跳转,请提示用户当前手机没安装APP。
(4)iPhone未安装支付宝钱包不跳转支付?在调用支付的时候取下[[[UIApplication shareApplication] windows] index:0]看看hidden属性是否为YES如果是就隐藏了window,H5就出不来了设置为NO就可以了[[[UIApplication sharedApplication] windows] objectAtIndex:0];或 把您的App中把第0个window的hidden属性改成NO,就可以了。
(5)iOS跳转到微信后立刻返回原APP?可能是由于微信中还保持上次等待支付的场景导致的。后台关闭微信,重新发起微信支付就正常了。
6.对地图的掌握程度
(1)使用系统自带的CoreLocation框架以及MapKit框架实现简单的地图显示,基本定位,自定义大头针功能,知道系统地图实现导航画线功能的也可以说一下。
(2)使用高德地图,百度地图实现地图定位显示,覆盖物添加删除,自定义大头针,POI搜索以及一些路线,公交的搜索的功能。
你好,我是大连24班的学生,2个问题。1.我在做一个类似豆瓣小组,这样的小组功能,在获取帖子的评论时,服务器给我返回的是html的格式数据,里面包括文字,图片,超链接等。我要把他放在tableview的每一cell中,用webview计算高度总是出问题,而且内存占用很大,用富文本有一些格式无法显示。有好的解决办法么?2.帖子的正文获取的也是html,是后台的一个网址,是webview解析网址。怎么去做缓存?我的邮箱:[email protected]
1.通过webview的didFinishLoad:方法,这个时候webview已经加载完成,可以获得真实高度。
2.通过js来获取实际页面的高度,获取的时机也通过js来监听。
3.通过检测webView.scrollView.contentSize,只要这个值发生改变,你马上就能够被通知。
可以使用这三种方法获取webView的实际高度,然后回调出去,tableview刷新数据
内存占用很大是因为webview加载本身就会占用很大内存,可以使用WKWebView去代替,很好的解决了UIWebView存在的内存、加载速度等诸多问题http://www.brighttj.com/ios/ios-wkwebview-new-features-and-use.html
缓存 就是写进文件,然后判断是否存在来发起请求或者加载本地文件
这个实现难点在缓存图片上。html代码的缓存对你来说不是问题吧。基于这个前提,
第1步、先获取html页面里所有图片地址。
方法一:离线获取获取到html代码。html代码你可以把他理解成是一个很长的字符串。通过正则表达式把这个html页面里的所有img标签url。如果是相对url,就加上host。如果是绝对url,就直接下载。这样这个页面里的所有图片路径都拿到了。
方法一的获取img标签url的正则表达式:
NSString *urlPattern = @"]+?src=[\"']?([^>'\"]+)[\"']?";
方法二:通过webview和js本地程序的交换,获取到html页面所有图片下载地址。
第2步、把下载图片到本地,把本地的图片设置到html代码中去显示。
http://bbs.csdn.net/topics/390831054
关于离线缓存webView的新方法NSURLProtocol
http://blog.sina.com.cn/s/blog_6291e42d0102v0hf.html
button立体效果怎么做
使用drawRect绘制阴影
8.上线的流程。
(1)申请APPID
(2)申请发布证书
(3)生成ProvisioningProfiles
(4)登录itunesconnect.apple.com,创建应用程序信息
(5)Xcode设置,将项目打包,最后把Ipa包提交苹果App Store
13.是否可以在一个视图控制器中前纳入两个tablView控制器?
一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,只能说可以嵌入一个tableview视图。当然,题目本身也有歧义,如果不是我们定性思维认为的UIViewController,而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController那样的感觉。
12.Core Foundation提供了哪几种操作Socket的方法?
提供三种:CFNetwork、CFSocket和BSD Socket
iOS网络编程之CFNetwork
http://www.cnblogs.com/kesalin/archive/2013/04/14/ios_cfnetwork.html
CFSocket使用有哪几个步骤:创建Socket的上下文;创建Socket;配置要访问的服务器信息;封装服务器信息;连接服务器;
http://blog.csdn.net/chang6520/article/details/7874804
iOS网络编程之BSD Socket http://blog.csdn.net/majiakun1/article/details/19357415
5、对于OC你认为最大的优点和最大的不足是什么?对于不足之处,现在有没有可用的方法绕过这些不足来实现需求。如果可以的话,你有没有考虑或者实践过重新实现OC的一些功能,如果有,具体会如何做?
最大的优点是它的运行时特性,不足是没有命名空间,对于命名冲突,可以使用长命名法或特殊前缀解决,如果是引入的第三方库之间的命名冲突,可以使用link命令及flag解决冲突。
虽然Objective-C在语法上禁止类使用多继承,但是在协议的遵守上却允许使用多继承。所以可以用协议来实现多继承。
http://www.cnblogs.com/ygm900/archive/2013/01/16/2862678.html
4.项目目录结构
一个合理的目录结构首先应该是清晰的,让人一眼看上去就能大概了解目录的职责,且容易应对新的变化。
目录结构
AppDelegate这个目录下放的是AppDelegate.h(.m)文件,是整个应用的入口文件,所以单独拿出来。
Models这个目录下放一些与数据相关的Model文件
Macro这个目录下放了整个应用会用到的宏定义
General这个目录放会被重用的Views/Classes和Categories。
Helpers这个目录放一些助手类,文件名与功能挂钩。
Vendors这个目录放第三方的类库/SDK,如UMeng、WeiboSDK、WeixinSDK等等。
Sections这个目录下面的文件对应的是app的具体单元,如导航、瀑布流等等。
Resources这个目录下放的是app会用到的一些资源,主要是图片。
3.大文件后台下载;
(1)http://www.tuicool.com/articles/ey2MrmB介绍三种方式使得iOS应用能够在后台进行数据更新和下载
(2)可以利用NSURLConnection实现大文件下载,主要是利用NSURLConnection和它的代理方法,在代理方法中处理服务器返回的数据,在接收到服务器返回的文件数据时,利用句柄对象往文件的最后面追加数据,实现代码可以参看http://www.th7.cn/Program/IOS/201412/328524.shtml
(3)https://github.com/thibaultCha/TCBlobDownload
有一个项目可以下载看看
1.流媒体编码解码;
流媒体是指在网络中使用流式传输技术进行传输的连续实时的媒体数据流,例如音频数据流或视频数据流,它是网络技术与音视频技术的完美结合。为了减少流媒体文件在实际传输中所占带宽,以及存储所占的空间,出现了很多种压缩算法。这些压缩算法再加上一定的文件格式就形成了流媒体的编解码技术。
http://blog.csdn.net/woaifen3344/article/details/40837803
7.登录加密
(1) 通过简单的URLENCODE+BASE64编码防止数据明文传输
(2)对普通请求、返回数据,生成MD5校验(MD5中加入动态密钥),进行数据完整性(简单防篡改,安全性较低,优点:快速)校验。
(3) 对于重要数据,使用RSA进行数字签名,起到防篡改作用。
(4)对于比较敏感的数据,如用户信息(登陆、注册等),客户端发送使用RSA加密,服务器返回使用DES(AES)加密。
原因:客户端发送之所以使用RSA加密,是因为RSA解密需要知道服务器私钥,而服务器私钥一般盗取难度较大;如果使用DES的话,可以通过破解客户端获取密钥,安全性较低。而服务器返回之所以使用DES,是因为不管使用DES还是RSA,密钥(或私钥)都存储在客户端,都存在被破解的风险,因此,需要采用动态密钥,而RSA的密钥生成比较复杂,不太适合动态密钥,并且RSA速度相对较慢,所以选用DES)
iOS中常用的加密方式:
1、MD5加密http://blog.csdn.net/xn4545945/article/details/36755117
2、base64加密http://blog.csdn.net/jacky_dai/article/details/4698461
3、HMAC加密http://blog.chinaunix.net/uid-20356525-id-1700433.html
4、对称加密算法
5、RSA加密
RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key).
•公钥(public key):用于加密数据.用于公开,一般存放在数据提供方,例如iOS客户端.
•私钥(private key):用于解密数据.必须保密,私钥泄露会造成安全问题.
虽然RSA加密算法作为目前最优秀的公钥方案之一,在发表三十多年的时间里,经历了各种攻击的考验,逐渐为人们接受。但是,也不是说RSA没有任何缺点。由于没有从理论上证明破译RSA的难度与大数分解难度的等价性。所以,RSA的重大缺陷是无法从理论上把握它的保密性能如何。在实践上,RSA也有一些缺点:
1产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密;
2分组长度太大,为保证安全性,n至少也要600 bits以上,使运算代价很高,尤其是速度较慢,。
http://blog.iamzsx.me/show.html?id=155002
6.把图片等信息传回服务器如何实现;
上传图片需要把图片信息转化成二进制,将图片编码到POST请求体(body)中,通过请求数据一起发送到服务器上
http://bbs.yusian.com/thread-8181-1-1.html
42.JSON与数据模型之间的转换怎么实现的
安层解析到你想要的数据层后通过KVC进行赋值来创建需要的model
6.平时使用的都有哪些框架;
UIKit Foundation AVFoundation MapKit CoreLocation CoreData
10.使用SVN时,遇到的常见的错误以及解决方法
权限问题:需要你们后台给你上传和修改的权限,在获取权限后才可以去上传和修改代码.
冲突问题:在上传代码是遇到冲突后首先先查看冲突文件内的内容,然后再查看下是自己修改的错误还是和别人上传了同一个文件,如果是两个人同时操作了同一文件需要先商量以后再做修改,如果是自己的书写有误直接修改后上传.
2.NSTimer结合UICollectionView做轮播的时候遇到的困难
一般我们做录播图使用的就是重用机制,在计时器中创建三个对象用来展示图片,一个是轮播过去的图片,一个是当前现实的图片,最后一个用来存放即将出现的图片,在创建完成后我们需要结合NSTimer来实现图片的自动滑动,每次滑动后对当前现实图片的imageView上的图片进行修改.这样就可以实现图片的轮播.
15.js、Html、oc怎么结合开发
一般我们展示JS和Html文件是使用的是UIWebView来展示,当我们需要对JS文件和Html文件进行操作是我们需要把JS和Html文件的内容解析出来后在自己工程中添加自己想要的CSS布局文件最后实现自己想要的布局.
18.用户上传评论图片存储在哪里
后台服务器的数据库中.
21.有即时通信的应用上传和没有及时通信应用上传有什么区别
有即时通信的应用需要在苹果测是的过程中对其编码进行回话.否则就会导致审核失败
27.导航功能实现
使用MapKit框架进行地图开发,对地图有精确的控制和自定义之外,如果对于应用没有特殊要求的话选用苹果自带的地图应用也是一个不错的选择。使用苹果自带的应用时需要用到MapKit中的MKMapItem类,这个类有一个openInMapsWithLaunchOptions:动态方法和一个openMapsWithItems: launchOptions:静态方法用于打开苹果地图应用。第一个方法用于在地图上标注一个位置,第二个方法除了可以标注多个位置外还可以进行多个位置之间的驾驶导航.
实现导航的最核心技术就是先获取用户当前的地理位置,然后确定用户的最终目的地,在地图上为用户直接标示最近的路线.最少需要提供三条路线供用户选择.
4、md5. AES DES RSA SHA有什么区别,其中的哪些你在什么情况下使用过?
AES:更快,兼容设备,安全级别高;
SHA1:公钥后处理回传
DES:本地数据,安全级别低
RSA:非对称加密,有公钥和私钥
MD5:防篡改
几种加密算法的详细介绍:
1、MD5加密http://blog.csdn.net/xn4545945/article/details/36755117
2、base64加密http://blog.csdn.net/jacky_dai/article/details/4698461
3、HMAC加密http://blog.chinaunix.net/uid-20356525-id-1700433.html
4、对称加密算法
5、RSA加密
RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key).
•公钥(public key):用于加密数据.用于公开,一般存放在数据提供方,例如iOS客户端.
•私钥(private key):用于解密数据.必须保密,私钥泄露会造成安全问题.
虽然RSA加密算法作为目前最优秀的公钥方案之一,在发表三十多年的时间里,经历了各种攻击的考验,逐渐为人们接受。但是,也不是说RSA没有任何缺点。由于没有从理论上证明破译RSA的难度与大数分解难度的等价性。所以,RSA的重大缺陷是无法从理论上把握它的保密性能如何。在实践上,RSA也有一些缺点:
1产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密;
2分组长度太大,为保证安全性,n至少也要600 bits以上,使运算代价很高,尤其是速度较慢,。
http://blog.iamzsx.me/show.html?id=155002
2、uiview的圆角属性的设置方法?
view.layer.cornerRadius = 20;
view.layer.masksToBounds = YES;
4、列举几种方法能够使类中属性A实现线程安全?
(1)设置属性A为原子属性atomic
(2)线程加锁
关键字
1)@synchronized(互斥锁)
优点:使用@synchronized关键字可以很方便地创建锁对象,而且不用显式的创建锁对象。
缺点:会隐式添加一个异常处理来保护代码,该异常处理会在异常抛出的时候自动释放互斥锁。而这种隐式的异常处理会带来系统的额外开销,为优化资源,你可以使用锁对象。
“Object-C”语言
1)NSLock(互斥锁)
2)NSRecursiveLock(递归锁)
条件锁,递归或循环方法时使用此方法实现锁,可避免死锁等问题。
3)NSConditionLock(条件锁)
使用此方法可以指定,只有满足条件的时候才可以解锁。
4)NSDistributedLock(分布式锁)
在IOS中不需要用到,也没有这个方法,因此本文不作介绍,这里写出来只是想让大家知道有这个锁存在。
几种线程锁的使用
http://blog.csdn.net/likendsl/article/details/8568961
5、如何设计一个可变高度(根据内容自适应高度)的UITablewViewCell
就根据cell里label的内容自动改变
http://blog.csdn.net/weasleyqi/article/details/38185093
可视化编程计算cell高度
http://www.jianshu.com/p/a0342ee86431?utm_campaign=hugo&utm_medium=reader_share&utm_content=note
1.如果上传完版本用户闪退…而且不知道什么原因怎么解决
上传完的项目可以使用Umeng、Crashlytics等统计Crash的工具。Umeng里面还集成了一个比较给力的功能,那就是错误分析,说白点就是用户在使用你的App过程中Crash掉之后发回来的错误报告。可以根据这个错误报告分析闪退原因,然后进行解决。
6.一个页面需要展示千万级别的数据量信息,谈谈你的设计思路或疑问。
如何构建千万用户级别后台数据库架构设计的思路
http://www.admin10000.com/document/1416.html
7.遇到没有做过的功能的时候,你会怎么做?
每个人的想法不同,根据自己的实际想法去说就好。
首先根据功能分析一下实现此功能需要用到哪些技术,可以和团队中人去一起探讨,在网上查阅相关的资料,看有没有类似功能的实现。最后自己按照自己的已有的思路去尝试实现此功能,有问题在进行修改完善。
6、How to hide status bar in ios7/8
有两种方法:
1、代码:
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleDefault;
//UIStatusBarStyleDefault = 0黑色文字,浅色背景时使用
//UIStatusBarStyleLightContent = 1白色文字,深色背景时使用
}
- (BOOL)prefersStatusBarHidden
{
return YES; //返回NO表示要显示,返回YES将hiden
}
2、不写代码,通过修改.plist文件的方式隐藏
找到项目中的.plist Viewcontroller-based status bar appearance设置这个项的Boolean的值(NO表示不显示系统的状态栏)
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
http://my.oschina.net/LouWk/blog/201326
4、数组去重方式有哪些?
(1)利用NSDictionary的AllKeys(AllValues)方法
(2)利用NSSet的AllObjects方法
(3)利用数组的containsObject来去除
(4)利用keyValue的方式
代码示例:
http://blog.csdn.net/wm9028/article/details/49926535
12.如何实现程序后台运行?
答:苹果是不赞成程序在后台运行的(因为很费电),除非后台运行能提升用户体验。有3种情况允许程序后台运行。(1)在前台开启了一个短任务,可以在程序进入后台的时候,向系统申请点时间把任务执行完。(2)前台有下载任务,可以在进入后台的时候继续下载。(3)一些特定类型的任务可以在后台运行,比如:定位,音乐播放,VoIP等等。
对于第一种情况,可以调用UIApplication类的beginBackgroundTaskWithName:expirationHandler:或者beginBackgroundTaskWithExpirationHandler:方法申请一点额外的时间去执行未完成的任务。调用这两个方法中的一个都会临时延迟应用程序进入休眠的时间,以便有时间把任务执行完。当任务执行完毕之后,应用程序需要调用endBackgroundTask:方法让系统知道任务执行完了,程序可以进入休眠状态了。不一定非得等应用程序要进入后台了才设置后台需要执行的任务。一个好的设计应该是在任务开始前就是用beginBackgroundTaskWithName:expirationHandler:或者beginBackgroundTaskWithName:expirationHandler:添加后台执行的任务,任务一旦执行完就调用endBackgroundTask:方法告诉后台,需要进入后台执行的任务执行完了(此时可能还没进入后台)。
对于第二种情况,如果要下载文件,应用程序应该使用NSURLSession对象去开启下载任务,这样系统就可以在程序休眠的时候控制下载,当我们配置NSURLSession需要在后台传输的时候,系统会单独开一个进程去处理下载任务,如果在下载的时候,进入了后台,会在后台继续下载。想要实现后台下载,我们需要配置NSURLSession。首先创建一个NSURLSessionConfiguration对象,设置一些属性,然后把NSURLSessionConfiguration对象设置给NSURLSession对象。具体步骤:(1)使用backgroundSessionConfigurationWithIdentifier:创建NSURLSessionConfiguration对象。(2)设置NSURLSessionConfiguration对象的sessionSendsLaunchEvents属性为YES。(3)如果在前台已经开始下载了,还需要设置NSURLSessionConfiguration的discretionary属性为YES。(4)为NSURLSessionConfiguration对象设置其他你需要的属性。(5)把NSURLSessionConfiguration对象设置给NSURLSession对象。
第三种情况属于Long-Running任务。如果需要实现长时任务,必须去申请,而且只有特定的类型才能长时间在后台执行。比如:后台播放音频,后台录音,后台定位和导航,VoIP,定期下载和处理新内容,定期接收外设的数据。需要在Info.plist添加UIBackgroundModes字段选择需要后台运行的事件类型,或者在工程的Capabilities里面打开Background Modes,勾选对应的事件,告诉系统会在后台运行什么类型的Long-Running任务,然后再根据不同类型的事件做相应的处理即可。
10.在iOS中如何实现国际化?
答:iOS中国际化需要做相关的配置:
(1)选中应用程序对应的project,然后添加所需要国际化的语言。
(2)新建Localizable.strings文件,作为多语言对应的词典,存储多种语言,点击右侧Localization,勾选国际化对应的语言。
(3)添加一个字段,设置你想要国际化的字段
在English中,添加:SUBMIT_BTN_TITLE = Go;
在Chinese中,添加:SUBMIT_BTN_TITLE =开始;
6、写一个标准的宏,这个宏输入两个参数并且返回较小的一个。
答:#define Min(X,Y) ((X) < (Y) ?(X):(Y))
17.UITableViewController中,创建UITableViewCell时,initWithSytle:resuseIdentifier:中,reuseIdentifier有什么用?简述UITableViewCell的复用原理.
答:只有在cell被滑动出界面的时候,此cell才会被加入到复用队列中。每次在创建cell的时候,程序会首先通过调用dequeueReusableCellWithIdentifier:cellType方法,到复用队列中去寻找标示符为“cellType”的cell,如果找不到,返回nil,然后程序去通过调用[[[UITableViewCell alloc] initWithStyle:style reuseIdentifier:cellType] autorelease]来创建标示符为“cellType”的cell。
50.OC的优缺点:
答:
优点:1、Category。可以很方便的为一个已有的类添加属性或者方法,而不需要笨拙的去继承它。2、posing。可以让一个类的对象动态的以其他类行为去执行,也许可以理解成动态replace所有的method(消息转发机制,比如是用Person类的一个对象去调用一个Student类的方法)3、 动态识别。 比较常见的动态语言的特性,涉及的点就多了,举个简单的例子,判断一个对象是否是某个类的成员。isKindOfClass: 4、弹性讯息传递 。方法(method)的动态处理,譬如当你调用一个没有的方法的时候,系统将是再运行时跑出异常而不是编译时给出错误。5、 不是一个过度复杂的C衍生语言6、Objective-C与C++可混合编程缺点: 1、不支持命名空间(写过c#等其他语言的应该比较清楚,可以通过命名空间将相同名字的类进行分类,而objc中不得不通过前缀进行区分,这也是为什么苹果的类库都有UIXXX NSXXX等统一前缀了)2、不支持运算符重载3、不支持多重继承4、使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。
56.在iOS中如何实现国际化?
答:iOS中国际化需要做相关的配置:
(1)选中应用程序对应的project,然后添加所需要国际化的语言。
(2)新建Localizable.strings文件,作为多语言对应的词典,存储多种语言,点击右侧Localization,勾选国际化对应的语言。
(3)添加一个字段,设置你想要国际化的字段
在English中,添加:SUBMIT_BTN_TITLE = Go;
在Chinese中,添加:SUBMIT_BTN_TITLE =开始;
1.IOS开发中,实现物体两点间的运动通常有哪些方法
2.IOS开发中UIEvent总体可概括为哪几种事件类型
触摸、摇晃、远程控制
简述Size Classes
3.IOS9 SDK中,替代UIAlertView和UIActionSheet的时什么
UIAlerController
4.你的xcode开发环境中装了哪些插件以便增加效率?(关键词也可以)
5.用预处理指令#define声明一个常数,用以表明一年有多少秒(忽略闰年情况)
#define k_secondsOfyear 365 * 24 *3600
6.列举所有你能想起的iOS开发相关api
7.请总结一下你对Cocoa touch框架的认识和理解(可以从框架内的功能特性谈起)
52. lldb(gdb)常用的调试命令?
1. breakpoint设置断点定位到某一个函数
2. n断点指针下一步
3. po打印对象
57.如何监测系统键盘的弹出
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector( ) name:UIKeyboardWillShowNotification object:nil];
59.说说你在项目中使用git的.
可视化工具(sourcetree)
服务器上创建仓库-> clone ->修改-> commit -> pull -> push
git命令行cd将你准备要上传的文件夹拖拽到这里,自动生成路径-> git init -> git add .添加所有文件(只是在本地准备好,注意那个“.”表示所有文件) -> git commit -m 'version 1.2.6'引号中是说明信息-> git remote add origin [email protected]:**********git ->git push origin master上传步骤到此完成
63.你做过哪些项目?项目中有何亮点技术点?
应用介绍:如做的XXX项目用户量达到XX万。
1、应用中的功能丰富(如图文混排、定位、支付、云等等)
2、逻辑复杂(使用设计模式,多线程)
3、数据库设计,预留冗余等。复杂交互(如使用了html,JS等,混编实现XX功能)
4、屏幕适配(此段不必提第三方)
64.有没有在AppStore上架产品?简单描述上架过程。
有。上架过程1.登录developer.apple.com。2.在member center中,首先创建App ID。3.创建配置文件,选择(App Store或Ad Hoc)。4.证书和配置文件以及bundle id就创建好了。在本地项目中做出相应设置。5.设置Build Settings,debug对应的是开发证书和开发的配置文件,release对应的是发布证书和发布配置文件,development对应的是测试环境,production对应的是生产环境。请大家根据实际情况选择对应的证书和配置文件。6.修改bundle ID(与之前在developer上创建的bundle ID保持一致)和bundle name(app的名字)。7.打包之前,先到https://itunesconnect.apple.com创建应用的名字填入相应的应用信息,应用截图,基本应用的资料 以及手动发行和自动发行版本等等。8.archive打包 ,根据需求(上传或测试)选择证书、配置文件和scheme。9.选择submit后会弹出一个选择账户的提示框,选择相应的开发者账户就好,下一步至上传完成。
24.项目上架遇到过什么问题?被拒原因?
1.崩溃和bug
当完成应用开发并准备发布时应该将app提交审核.在提交审核前,要确保已经在设备上对应用程序进行了彻底的测试,修复了bug;
2.占位符内容
在提交应用进行审核之前要完成所有的图片和文本,仍处于开发阶段或者包含占位符内容的应用不能准备发布,也不能通过审核.
3.不准确的描述
应用程序的描述和截图应当清晰精确的传达其功能,这样可帮助用户理解你的应用程序,并有助于塑造正向的用户体验.
4.不合标准的UI
苹果高度推崇整洁的,精致的以及对用户友好的界面.开发者需要仔细规划设计,遵循苹果的设计规则和UIDesignDosandDon’ts,这样才能确保你UI能达到要求.
25.项目开发过程中有没有遇到什么问题?如何解决?
1.插入了设备,如iPad、iPhone、iPod等,但弹出“No provisioned iOS device is connected.”
解决方法:
重新插入设备,确保“Window-->Organizer”窗口中左侧的设备有绿色亮点
2.插入iPod,弹出“Could not receive a message from the device.”
解决方法:
网络上的资料是说重启设备,但是我重启了仍弹出上述警告框。换了根线后这个问题也解决了
3.调试时项目可以运行,可是点击某个按钮时却崩溃了,在控制台输出
解决方法:
该异常属于内存泄露问题。如果是标准C中空指针引起的问题则IDE生成的调试信息会自动指向该位置,如果IDE没有指向,则检查自上一次正确运行以来添加或修改的代码中release、alloc、赋值、数组初始化等容易引起内存访问错误的位置是否有问题。在有断点的情况下,如果出现异常,则IDE中指向的位置并不一定是程序崩溃的位置。
26.写过哪些技术文档?
1. iPhone开发之iOS Socket开发
2. iOS开发之程序增加启动画面介绍
3. iPhone开发之多线程之NSInvocationOperation
4. iPhone开发之地图开发,在地图上画线路
5. iOS 5编程 内存管理ARC技术概述
6. iPhone开发之获得通讯录中联系人的所有属性
7. iPhone开发之用NSData和NSUserDefaults存储应用程
8. iPhone开发之异步加载网络数据,自定义进度条显示
9. iPhone开发教程之保存当前view到相册(截屏)的方法
28.有没有做过地图开发?需要注意哪些问题?
1.注意BMKManager对象的生命周期管理,在使用地图SDK期间不能释放该对象,尤其在arc情况下注意避免提前被自动释放,否则,该对象一旦被释放,网络模块将不可用,地图无法加载,检索失败。
2.百度地图iOS SDK v2.5.0起,对arm64进行了支持适配,开发包体积有所增加。但根据开发者在研发过程中的选择,最终生成的APP体积并不会发生较大的变化。
3.在使用Xcode6进行SDK开发过程中,需要在info.plist中添加:Bundle display name,且其值不能为空(Xcode6新建的项目没有此配置,若没有会造成manager start failed)
4.自iOS SDK v2.5.0起,为了对iOS8的定位能力做兼容,做了相应的修改,开发者在使用过程中注意事项如下: 需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription,允许永久使用GPS的描述
5.静态库中采用ObjectC++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即将Xcode的Project -> Edit Active Target -> Build -> GCC4.2 - Language -> Compile Sources As设置为”Objective-C++"
76.讲述一次在这个APP中,用户触发了一个事件,引起了一个服务请求,然后获取服务端返回,并且更新前端界面的过程。请说的详细一点,比如数据经过了哪些类的处理,每一次传递时的格式是怎么样的?
77.你参与的APP,是如何处理多个服务的同步发起的?
使用iOS线程技术,创建并行队列来分别执行不同的任务。将不同的任务加入到子队列当中,任务执行后回到主线程当中刷新UI界面。
APP界面一般都是根据产品需求和UI效果图来完成的,但是我们为了提高代码的复用性,会将视图的实现进行封装,然后在控制器当中进行加载调用。
93.MD5和Base64的区别是什么,各自场景是什么?
MD5:全称为message digest algorithm 5(信息摘要算法),可以进行加密,但是不能解密,属于单向加密,通常用于文件校验
Base64:把任意序列的8为字节描述为一种不易为人识别的形式,通常用于邮件、http加密.登陆的用户名和密码字段通过它加密,可以进行加密和解密.
96.如何添加一个自定义字体到工程中
8.添加ttf文件.
9.通过[UIFont fontWithName:@"字体名" size:20.0];使用
97.如何制作一个静态库/动态库,他们的区别是什么?
使用静态库的好处
1,模块化,分工合作
2,避免少量改动经常导致大量的重复编译连接
3,也可以重用,注意不是共享使用
动态库使用有如下好处:
1使用动态库,可以将最终可执行文件体积缩小
2使用动态库,多个应用程序共享内存中得同一份库文件,节省资源
3使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。
视频的边下边播
格式MP4
5、瀑布流是如何实现的
这个是使用tableview来实现的瀑布流但是主流实现瀑布流的方式是使用collectionView来实现瀑布流,其核心技术就是按列数创建对应的可变数组,数组中记录的是你每行的最终高度.然后用最低值来拼接下一个图片.
1.总先做成几列是事先要清楚,有多少条记录,这个可以从json或者xml中读取后知道(json或xml最好将图片的高度和宽度也显示出来,便于后面用到)。
2.假设要做成3列,就用三个uitableview,宽度平均,高度动态,页面高度取uitableview中最高的。
3.三个uitableview初始化的时候用到tag(我越来越觉得tag在ios中的用处很大,就像js中读取html控件中的id一样),然后showsVerticalScrollIndicator和scrollEnabled设为no,separatorStyle设为UITableViewCellSeparatorStyleNone,添加到UIview中。
获取高度
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return当行记录数/列;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
int arrIndex=当前indexPath.row *列(3)+当前indexPath.column;|
return [[XML/JSON objectAtIndex:arrIndex] objectForKey:@"高度"];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//从数据源中得到当前数组对应的数据,然后再用uitableviewcell填充
}
4.系统的searchBar是如何实现搜索的
系统的searchBar其实就是对系统的TextFelid和button进行的封装和添加了一些代理时间,其本身是不具备搜索功能的,想要用searchBar来实现搜索功能需要结合后台的搜索接口来实现对应的搜索功能.
1、图文混排
图文混排的概念:
在view上显示的数据既包括文本数据,也包括图片数据。
图片的大小可以不同,图片和文字的排列顺序不固定。
文本数据的字体、颜色、背景等其他属性可以不同。
文本数据中还可以包含超链接。可以点击超链接进入其他页面。
实现方法:
(1)用HTML实现文字表情混合排列
用HTML实现图形文字混排的好处就是你不需要考虑表情在文字里面的位置问题,你只需要自己做一个HTML,然后用UIWEBVIEW加载一下,然后再把WENVIEW放到视图上,颜色字体什么都是可以调节的,但是从内存考虑,聊天一般都用UITableView做最下层的容易,因为内存容易管理,(表会自动释放),如果是用UISCrollView加载的话,则内存会逐条增加。如果用表的话,因为UIWebView加载HTML会有延迟,无论是本地还是网络,所以在CELL里面放UIWebView刷新表的时候会有闪烁的效果。所以个人觉得HTML来实现的话只适合DEMO阶段的糊弄下人,因为UIWebView也是很占资源。
(2)用UILabel+UIImageView实现图文混排
这个方法实现的基本思想就是对要发送出去的内容做判断,以表情来做分割,是纯文字的就用UIlabel来存放,表情就用UIImageView来进行存放,只要算好他们他们的互相位置就可以,最终把他们放到一个UIView上,然后再加到你要显示的地方,但是这个判断还是比较繁琐的,这个方法我觉得没什么亮点,但是内存消耗还是比上面的HTML要小,这个倒是真得。切加到表里面也不会有闪烁。
(3)用drawRect实现图形文字的混排
drawRect方法的好处就是内存什么都可以更改,字体的颜色也是可以灵活设置的,而且内存损耗比较小。
drawRect实现的基本思想是,首先你给定的最大换行宽度是多少,然后以这个宽度来分割你输入的字符,将你分割的字符分别放入一个数组里面,当然不是随便的放得,取字符的时候要判断结尾跟开头的空格,因为在IPHONE里面结尾空格是会自动换行的,同时要判断结尾是否有表情,加上表情的话宽度是否超过最大的宽度,判断每一段字符的里面表情的位置和图片名也需要保存起来,最后绘制文字和图片的时候分别用
[string drawInRect:CGRectMake(x, y, Width, Heigh) withFont:Font]; [image drawAtPoint:CGPointMake(x,x)];
当然如果你做得一套大小合适的图片这样就足够了,但是如果你的工程需要适应多种字体和表情大小,drawAtPoint不能缩小图片,需要更多地处理。
(4)使用CoreText实现图文混排
CoreText库中提供了很多的工具来对文本进行操作,例如CTFont、CTLine、CTFrame等。利用这些工具可以对文字字体每一行每一段落进行操作。
CoreText实际上并没有相应API直接将一个图片转换为CTRun并进行绘制,它所能做的只是为图片预留相应的空白区域,而真正的绘制则是交由CoreGraphics完成。
在CoreText中提供了CTRunDelegate这么个Core Foundation类,顾名思义它可以对CTRun进行拓展:AttributedString某个段设置kCTRunDelegateAttributeName属性之后,CoreText使用它生成CTRun是通过当前Delegate的回调来获取自己的ascent,descent和width,而不是根据字体信息。这样就给我们留下了可操作的空间:用一个空白字符作为图片的占位符,设好Delegate,占好位置,然后用CoreGraphics进行图片的绘制。
2、正则表达式的用法
正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式。正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分。它可以迅速地用极简单的方式达到字符串的复杂控制。
iOS中有三种方式来实现正则表达式的匹配:
(1)利用NSPredicate(谓词)匹配 谓词匹配比较灵活,但是需要有谓词的相关知识。
例如匹配有效邮箱:
NSString*email=@“[email protected]”;
NSString *regex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL isValid = [predicate evaluateWithObject:email];
(2)利用rangeOfString:option:直接查找options中设定NSRegularExpressionSearch就是表示利用正则表达式匹配,会返回第一个匹配结果的位置。
NSString *searchText = @"// Do any additional setup after loading the view, typically from a nib.";
NSRange range = [searchText rangeOfString:@"(?:[^,])*\\." options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
NSLog(@"%@", [searchText substringWithRange:range]);
}
(3)使用正则表达式类 使用系统的正则表达式类(NSRegularExpression)会返回匹配的多个结果。
NSString *searchText = @"// Do any additional setup after loading the view, typically from a nib.";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:[^,])*\\." options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
if (result) {
NSLog(@"%@\n", [searchText substringWithRange:result.range]);
}
2、科技公司的人员结构
技术成员:后台服务端人员、前端开发人员:iOS,安卓,web产品经理UI设计师
1、项目开发流程?
2、用户收藏的数据保存到哪里?
根据不同的用户保存数据到后台数据库中
5.怎么学的这门语言
如果学生的话 可以说在公司实习的时候学习的
如果是已经毕业的学员 可以说 前期培训过,之后工作了多长时间
6.,薪资比例,薪资多少钱,去掉税和 五险一金多少钱
使用80%或者100%
公司一般都是按照北京市最低标准8000的话1200 - 1300
14000在2300左右
~zim�u�w�