一、表格上滑则导航栏消失,下滑则导航栏出现,自带动画。前端
self.navigationController.hidesBarsOnSwipe = YES;ios
二、导航栏默认的模糊背景是由于系统自动设置了背景图片,下面代码能够清空背景图片,让导航栏变成透明状web
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];sql
三、导航栏下方有一根像素为1的线,下面代码能够清空它数据库
self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init]swift
四、自定义窗口UIWindow视图,默认状态下其是隐藏状态,必须手动设置为不隐藏才能显示(主窗口的建立除外)数组
UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; window.hidden = NO;xcode
五、iphone自带顶端下拉\底部上拉状态消失后会发出应用程序进入活跃状态的通知UIApplicationDidBecomeActiveNotification浏览器
六、[NSDate date]方法获取的是系统当前时间,若用户手动修改系统时间,则该方法返回值会发生变化缓存
七、定时器NSTimer\CADisplayLink均会强引用target自己,若其为target属性时须要注意循环引用,设置为nil可打破循环
八、UIAlertController事件回调有延迟大概0.5s,若其附带输入框,则键盘会在事件回调执行结束后才收起,效果不好。只能自定义视图解决
九、表格视图cell高度缓存用NSCache,注意最好别用indexPath做为key,由于下拉刷新时必须本身将全部缓存清空,使缓存失效。上拉可没必要
十、我所碰到过的内存泄露状况,即控制器不销毁
a、block循环引用
b、定时器对self的强引用
c、视图添加动画,同时写了scaleAnimation.delegate = self; scaleAnimation.removedOnCompletion = NO;
缘由:动画代理对控制器强引用,而动画完成后又没有从图层树移除,循环引用。
加后面那句代码缘由:在viewdidload方法中添加动画,若不写这句代码则动画不会执行,能够采用GCD延迟如0.1s再执行动画避免加这句代码。
也可加这句代码,可是当动画完成后移除动画图层。
十一、视图的frame.size和bounds.size不一样的状况:
a、视图transform有旋转或缩放时
b、图片在scrollView中缩放时
十二、swift中addtarget多参数方法:
btn.addTarget(self, action: "function:parameter2:parameter3:", forControlEvents:.TouchDown)
func function(parameter1: Int, parameter2: Int, parameter3: String) {}
即函数名:第二个参数:第三个参数:,注意,按钮点击事件参数类型不能为上面所写的String,能够为NSString,Int,NSArray等其余类型,缘由不明
1三、打破block循环引用方式:
a、__weak弱引用。经常使用方式,缺点,因为不对外面对象进行强引用,block执行时该对象可能已经被释放
b、__blcok修饰变量,执行block后将其置nil。优势:强引用外部对象,保证其生命周期。缺点:必须执行block才能避免内存泄露
blk_k blk; { id arr = [NSMutableArray array]; __block id blockArr = arr; blk = ^(id obj){ [blockArr addObject:obj]; blockArr = nil; }; } blk([NSObject new]);
1四、服务器返回字段有时会是<NULL>,对应OC中的NSNull对象,与nil不一样,好比将其赋值给label.text会崩溃。
我的认为区别:null是一个NSNull类型的单例对象,有具体变化的类存地址,对其发送消息会崩溃。nil内存地址始终是0x0,发送消息不崩溃
1五、一个UI对象用transform旋转180度时,老是顺时针旋转,没法经过设置-M_PI的方式让其逆时针旋转。采用下面方法可讲其顺时针->逆时针->顺时针依次旋转。原理:就近原则
static NSInteger flag = 1; flag *= -1; CGFloat angle = M_PI + 0.00001 * flag; [UIView animateWithDuration:2 animations:^{ self.redView.transform = CGAffineTransformRotate(self.redView.transform,angle); }];
1六、Instruments
a、时间分析器Time Profiler:用来检测CPU的使用状况,查询某个方法消耗的CPU时间,找出CPU性能瓶颈
b、Core Animation :滑动时的FPS,颜色等
b一、Color Blended Layers:基于渲染程度对屏幕的混合区域进行绿到红色的高亮,因为混合色,对GPU性能有很大影响
b二、Color Offscreen-Rendered Yellow:离屏渲染黄色高亮,极可能须要用shadowPath或shouldRasterize优化
c、OpenGL ES驱动:GPU的利用率,性能瓶颈
c一、Renderer Utilization: 若大于50%,多是离屏渲染或过分重绘,须要优化
c二、Tiler Utilization: 若大于50%,图层几何结构限制,如太多图层被占用
1七、
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if (url) {[[UIApplication sharedApplication] openURL:url]; }
上面代码会自动打开app关联的设置位置,好比你的app有消息推送,地图等,当用户关闭了访问权限时,这些功能则没法使用,能够在使用时弹出提示框提示用户打开权限,再调用该方法直接跳转到相应位置设置
1八、图片解压:用 imageNamed:从 bundle 里加载不会马上解压。而是在赋值给 UIImageView 的 image 或者 layer 的 contents 或者画到一个 core graphic context 里才会解压。对大图片必要时可采用后台draw方法解压,后再赋值的方式减轻解压时CPU压力,避免卡顿
1九、JS和OC交互方式: 拦截协议、JavaScriptCore、三方框架WebViewJavaScriptBridge、WKWebView
20、项目优化点
a、内存: 1.图片读取方式(imageNamed:有内存缓存,imageWithContentFile没有内存缓存)、2.表格cell复用、3.自动释放池、4.dealloc打印查看控制器和视图是否销毁
b、用户体验:1.AFN和提示框组合封装,设置提示框延时出现时间,网络优良时不出现、2.push进界面,避免网络未返回时界面太难看,或者网络一返回界面出现向下移动等,采用蒙蔽优化、3.屏幕适配,防止输入框被键盘挡住、4.UIAlertController点击按钮系统反应会延迟约0.5s,没法解决,自定义视图解决
c、性能优化:1.大量IO操做如从沙盒读取大量图片考虑线程解决、2.大图片注意显示那一刻才会解压,耗费CPU,能够考虑后台cos2D解压,再设置、3.表格中有大量定时器时,定时器能够运行在后台线程,注意定时器复用,注意开启runloop、4.UIimageview尺寸最好跟图片大小一致,动态拉伸耗费性能、5.表格视图中cell上面,最好别设置动画、透明度、圆角、阴影等,能够用Instruments测试下FPS,若太低能够用上面的Instruments分析方法优化、7.尽可能别重写drawRect方法,会引起离屏渲染,能够用UIBerzePath和CAShapeLayer画图、8.性能优化利器,缓存,缓存,缓存、9.避免频繁建立销毁视图,能够用懒加载,不须要时removeFromSuperView,须要时加上、10.避免无效网络请求,退出视图取消网络请求,同一个网络请求连续屡次发送(如玩赚宝购买页面输入购买金额,实时网络请求计算收益)取消掉上一个网络请求,避免前一个网络请求返回延后使数据错乱
21 、我碰到过的AppStore被拒绝状况
a、app中设置了更新版本选项
b、开启后台定位模式,但app描述中没有添加这句话:“后台定位对电池有损耗。。。”
c、广告轮播图中有Applewatch字样
加急审核技巧:当没有严重bug时,能够说集成的支付功能未作加密等处理,须要立刻更新。苹果比较重视安全,极可能会经过审核
2二、sskeychain知识点:
在iOS中每一个APP 都有属于本身的Keychain,最经常使用就是保存用户的帐户和密码,就是记住密码,放在这里很安全(苹果负责帮咱们加密再存起来,若是出了问题怪他咯!),假如用NSUserDefault 保存这些秘密数据,生成的plist文件(就放在那个Library/Preferences 下)容易被拿到,并且还要本身作加密。
特性:1.当app删除了,又再次从新安装,这个保险柜里的信息还存在
2.安全!做为小白的我并不知道它其实是存在哪里的。
// 删除之前保存的全部帐号和密码 ,参数service服务名(这个方便对帐号密码进行分类)
NSArray *accounts = [SSKeychain accountsForService:kSSToolkitMyPswdServiceName];
for (NSDictionary *dictionary in accounts) {
NSString *account = [dictionary objectForKey:@"acct"];
[SSKeychain deletePasswordForService:kSSToolkitMyPswdServiceName account:account];
}
2三、ios7系统异常(ios8以上不会出现)
a、定时器每秒调用一个方法,在方法内部用[btn setTitle: forState:]给按钮设置一个不断变化的标题,不会生效。采用btn.titleLabel.text = @"“解决
b、xib封装视图时,在视图内部重写layoutSubviews方法,里面设置self.width和self.height的值会崩溃。解决方法:外部设置宽高,或内部别的地方设置宽高,若宽高等于屏幕宽高,且xib是豆腐块类型时,不用设置,会自动匹配
c、xib中,对按钮,使用控制面板属性User Defined Runtime Attributes设置圆角、切割等,拷贝该按钮到另外的xib中,程序崩溃。解决方法,删除运行时设置(后面重现时又不出现了,缘由不明白。。。)
2四、APNs
a、ios8之前推送内容大小限制在256字节,以后提高到2k。2015年发布新版APNs协议,提高到4k
b、旧版APNs:APNs不能保证分发消息的服务器(好比第三方SDK的服务器)socket维持链接,若是socket通道上没有消息往来,socket会被路由器中断。且服务器分发消息到APNs成功后没有回应,失败后才有error并关闭该socket,所以没法知道服务器是否成功将消息分发到APNs。之前作聊天类APP,有用推送来作的,为了知道消息是否发送成功,故意每10条消息后发送一条错误消息(如用错的token),若是没有回应就代表已经中断了socket连接,上面的10条消息就另外处理。
c、新版APNs:支持返回状态码,服务器发送消息到APNs成功返回200,失败返回error。内容大小到4k。可经过心跳包检测当前socket是否可用,并维持该连接。
d、目前存在问题:APNs向你推送4条消息,但你的设备网络差,在APNs那里下线了,这时你的设备的推送列表上有4个任务列表,合理状况是当你的设备网络好时所有推送给你,但APNs只会保留最后一条消息推送给你,并告诉你一共有4条消息,丢失了另外3条(缘由多是APNs的存储-转发能力不够)。尽管这样,APNs仍然没法保证这4条消息必定能至少推送1条给你。倘若能收到一条,通常是询问服务器看你有多少条未读消息(技术手段多是用当前消息数组数量跟服务器返回的消息数作对比得知有多少条消息未收到)。如今的SDK能保证消息都推送到APNs(根据返回状态码,若推送失败,重发),但APNs没法保证推送到用户。
2五、系统弹框和键盘的冲突
问题:键盘在屏幕上时,若弹出系统提示框如alertview,系统会自动退下键盘,拿到窗口来显示alertview,若点击alertView跳转到另一个页面,系统仍旧会还原键盘的初始状态,使页面出现一闪而过的键盘视图,很难看。能够先彻底退出键盘,在弹出系统提示框避免该问题。
2六、启动广告实现方式
a、实时下载图片显示,适用于图片变化不是很频繁的场景
b、先显示上一次缓存的图片,这一次将图片从服务器获取并缓存,以便下一次使用。
问题点:针对根控制器不固定的场景,在显示广告的时候获取到须要加载的根控制器,保存,当广告完毕后切换根控制器。当广告过程当中点击了图片,则先切换根控制器,再push到广告详情页面。
2七、appstore相关
a、构建版本时,苹果使用的是项目中的build号做为key,即不能上传两份build同样的版本。但版本号version能够相同
b、appstore下架后,只是将app从appstore的搜索列表中移除,让别人搜索不到。只要取消下架,APP又会从新上架
c、加急审核跟提交版本是两个独立的操做,经过appid关联两个操做。例子:对某个app进行加急后,取消该app的审核状态,从新打包上传,即便版本号改变,依然是在加急状态
2八、JPUSH若没法推送成功,选择开启日志输出,好比日志提示说证书缘由致使JPUSh没法使用,刚好早些天苹果我的帐号后台这些证书有变更,从新生成证书,传到JPUSH后台即成功。注意,将证书删除再从新生成新的证书上传,不会影响线上版本的推送。
2九、友盟默认拿的是xcode中的bulid号做为版本统计,而不是想固然的version号
30、对图片不少的页面,例如微信空间等,可采用显示小图片,当点击图片浏览时再下载大图片。若直接使用大图片,当有不少图片时,会形成CPU使用率过高,好比藏家APP刚开始就使用的大图,致使CPU很容易达到100%,iPhone4上很容易闪退。还有,从相册拿出图片是ALAsset类型的,当将其解压转换为UIImage时会卡住主线程,须要注意。有一个跑马灯视图,因为内部使用非法动画形成循环调用,也就是动画死循环一直执行,形成CPU超过100%(多核可能超过)发热严重
3一、播放视频用MPmovieplayercontroller或者AVPlayer,当网络不佳缓冲时,都不知道什么时候缓冲完毕(多是由于什么时候缓冲完毕很差定义),我是采起随机一个5-10s的数字,让缓冲这个时间后再调用播放的方法。MPmovieplayercontroller当取消全屏时,通知MPMoviePlayerWillExitFullscreenNotification监听不到,AVPlayer观察者观察不到playbackLikelyToKeepUp(缓冲足够的BOOL属性)的变化。
3二、UIPageControl,默认子视图都是UIView类型,当用KVC设置了pageImage和currentPageImage属性后,子视图会变为UIImageView类型。当设置UIPageControl的currentPage时,系统内部是先拿到对应的子视图,再切换子视图对应的图片。通过验证,有很小的可能,UIPageControl的子视图仍然是UIView类型,这时候设置currentPage时,拿到的是UIView而且给它设置UIImage,引起崩溃。因此,若是须要设置系统UIPageControl样式,最后自定义。而非用KVC
3三、极光推送,若要求针对某一个版本好比2.0.2作推送,能够后台作,前端作法是绑定tag或别名,可是sdk2.1.9以前是不支持特殊符号,好比.号的,因而采用去掉.号如202的绑定方式。
目标人群设置是多选,能够根据registeration id(具体手机的id),别名,tag等多重选择选定人群。
附加字段会设置到推送的字典里面去,一个为key一个为value,在项目中对其进行处理
3四、其余
NSURLRProtocol缓存web内容,监听一切url请求(WKWebView除外)
layer.mask,涂层mask有妙用
CAShapeLayer配合UIBeriPath作动画
栅栏化(大意是将要cell缓存成一张图片显示,提高表格性能,Core Animation书上有)
SDWebImage播放gif图片时内存容易爆掉,缺陷在gif图片拆分红多张帧图片时存储在一个数组中,该数组致使内存变大。YYAnimationView(YYKit框架)不会这样。思路大概是开启CADisplayLink,不断存储下一帧须要播放的图片并清除掉已经播放完毕的图片。SDWebImage和YYWebImage为了性能优化,都是缓存的图片数据解压后的data,此对大图片容易形成内存爆炸,有个属性能够禁用图片解压操做,或者能够限制内存缓存,或者限制内存缓存大小等。。。
内存泄漏:block,delegate没用weak,C、CF语言框架,工具类方法传入了控制器的view,而方法内部强引用了控制器(注意保证工具类方法view属性为weak便可),。 通常会在控制器销毁时观察dealloc方法判断是否有内存泄漏。能够考虑作个简易框架,原理:监测导航栏的pop方法,该方法内部延后一段时间(好比2s),断言该控制器为nil,不然未销毁程序被打断
cookies和session,前者客户端,会增大http头的大小,保存少许信息,如浏览器帐号密码等,安全等级低。后者服务端,可是须要客户端配合保存sessionId,安全等级高。这两个东西大致是相同的,做用:增长网络访问速度。好比app加载一个web页面,非首次加载明显变快
本地缓存如何在服务器内容修改后及时更新?Last-Modified 或者 Etag,标示服务器内容是否更改,未更改则返回特定状态码而非数据,不然直接返回数据。由于请求等幂等缘由,POST请求没法被缓存。
数字签名原理详解:http://blog.jobbole.com/107930/
http请求头中KeepAlive的做用就是在第一次建立链接时,服务器会把这个tcp链接保持一段时间(服务器端会有一个keepaliveTime的最大时间,超过期间就断开链接)。缺点,长连接消耗服务端内存
网络请求DNS解析缓存,配置HOST文件绕过DNS解析,网关。。。
FMDB时,数据库嵌套操做会致使死锁。
tableView中cell上有个文本框,文本框内容变化时调用tableView的reloadData会致使键盘自动消失。此时可用beginUpdates和endUpdates替代刷新操做
CAAnimation的delegate属性是strong,缘由
一、动画是异步的,动画完成后动画线程销毁,delegate属性清空,不会产生内存泄露
二、若不用strong,则若动画过程当中控制器销毁,而动画代理方法中引用了控制器,程序可能崩溃
尽可能不要设置removedOnCompletion = false ,这样动画完成后代理并不会被清空,配合CAAnimationDelegate会带来循环运用的问题,若是须要动画停留在最后的状态,能够直接设置View的center属性在动画结束的位置Point
线程间通讯:
一、基于端口的输入源: NSPort 的方法- (BOOL)sendBeforeDate:(NSDate *)limitDate msgid:(NSUInteger)msgID components:(nullable NSMutableArray *)components from:(nullable NSPort *)receivePort reserved:(NSUInteger)headerSpaceReserved;
二、[self performSelector:<#(nonnull SEL)#> onThread:<#(nonnull NSThread *)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>],缺点是执行线程方法时若线程已经销毁,则崩溃
三、自定义输入源:使用CGRunLoopSourceRef
相关详细文章地址:http://www.jianshu.com/p/4d5b6fc33519
3八、 输入中文时限制字符长度
- (void)textViewDidChange:(UITextView *)textView{
NSString *toBeString = textView.text;
NSString *language = textView.textInputMode.primaryLanguage;
if ([language isEqualToString:@"zh-Hans"]) {
UITextRange *selectedRange = textView.markedTextRange;
// selectedRange为空,说明拼音已经转换为中文
if (!selectedRange && toBeString.length > 5) {
textView.text = [toBeString substringToIndex:5];
}
}else if(toBeString.length > 5){
textView.text = [toBeString substringToIndex:5];
}
}
39.Array 的深复制
指针的复制
dataArray3=[dataArray2 mutableCopy];
知识对dataArray2 进行了深复制,数组中的内容仅仅是指针的复制。
单层深复制
dataArray3=[[NSMutableArray alloc]initWithArray:dataArray2 copyItems:YES];
dataArray2进行自己和内容的深复制。单仅仅是内容的第一层
彻底深复制
dataArray3 = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:dataArray2]];
无论多少层均可以进行了深复制
40.MLeaksFinder 检查内存泄露
41.有些偶尔会出现的bug缘由猜想
a、有些代码是有执行顺序的,而网络请求返回时间不定致使
b、线程问题。如多线程异步队列任务执行结果顺序不必定致使
c、dispatch_group_t因为请求可能的失败致使的组进出次数不一致致使崩溃
d、服务器线程问题。好比同时日程重构,同时发送两个请求,可是服务器最终访问的是一个方法,线程错乱致使回调结果反了
42.fmdb优化
精简sql语句,好比表的链接操做,小的表放到左边,总之让过滤条件先过滤掉尽量多的数据
fmdb默认缓存是关闭的,开启
默认执行一条sql开启关闭一次事物。批量操做时,手动开启事物,不少sql执行完毕再提交或回滚事物
fmdb存储数组对象。能够一张表,则数组对象归档成nsdata,对象之间用逗号分开,把数组对象当成字符串存储
coredata,有一种自定义存储类型Transformable,能够存储数组,也是利用归档原理
也能够两张表存储,可是那样管理麻烦