首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS开发笔记(五)

前言

社会的模式很多是重复的,当你做一样事情很擅长时,与之类似的事情也能触类旁通。

正文

Code开发

1、delegate的trick 很多人习惯在调用delegate,先用responseToSelector判断,方法是否有被实现,再执行回调方法。 但是,在较长的时间之后、或者其他人更改delegate代码的时候,如果更改声明,Xcode会提醒开发者delegate的方法没有实现,但是responseToSelector是无法提示的。 这样就很容易触发之前responseToSelector埋下的炸弹。

思考思考:是否可以把delegate的部分方法使用requried关键词。

2、UICollectionView打开时,从某个cell开始显示 方法一:调用scrollToItemAtIndexPath:atScrollPosition:animated:; 方法二:继承UICollectionViewFlowLayout,在prepareLayout的方法内设置contentOffset的偏移;

这个功能很常见,但是要在合适的时机调用,比如说viewWillAppear;

3、cocoapods升级 cocoapods升级到1.2.0后,pod install 显示 cocoapods is not used in any concrete target 注意到报错的关键词'target',打开podfile一看究竟: 发现podfile 还是老版的格式 原来只需要一行:pod 'LFLiveKit'即可 现在的格式应该如下

代码语言:javascript
复制
platform :ios, '7.0'
inhibit_all_warnings!
target 'Live' do
    pod 'LFLiveKit'
end

target对应的是xcode工程里面的target

4、run script only when installing 属性 这个选项的属性,不是在安装的时候,而是打包的时候。

In the Xcode Build System Guide (Xcode 3.2.x), it says: Run script only when installing. Runs the script only during install builds, that is, when using the install option of xcodebuild or when the build settings Deployment Location (DEPLOYMENT_LOCATION) and Deployment Postprocessing (DEPLOYMENT_POSTPROCESSING) are on.

代码管理

1、SVN 最近开始用SVN,在用svn进行commit的时候,遇到以下报错: svn: E200009: 'reademe@2x.png': a peg revision is not allowed here 这个文件用svn delete、svn revert都无法修改,后面GG一番之后发现有个方法是: svn delete reademe@2x.png@ 原来是带@符号的名字会出问题

svn revert 可以重置单个文件修改; xcode 可以丢弃所有的更改; svn delete 是删除某个svn里面的数据,非svn的数据直接rm;

2、SourceTree 在用git拉取代码的时候,遇到以下报错: (internetKeychainItemForServer:withUsername:path:port:protocol:) - 在钥匙串中找不到指定的项。 1、密钥的密码是否输错; 2、检查下mac用户目录下的.ssh/ 里面是否有对应的密钥;

3、Xcode字体调整 最近工作的电脑换成iMac,Xcode默认字体比较小,通过偏好设置的font可以调整编辑器的字体大小,但是找遍设置都没发现project navigator的字体大小修改。

网上看到一句嘲讽: Given that this was first asked in XCode 4 (or even earlier) and now they're on XCode 7 and still haven't made it available, I'm guessing you can safely say they will never offer this ability.

数据分析

最近需要对线上LOG进行分析、统计,有十几个文件,几个G大小。 由于对c++比较熟,就用它进行数据分析,在尝试过程中遇到几个坑:

1、freopen重复打开多个文件 打开文件可以用open(c)也可以 freopen(c++),这里为了方便,使用的是freopen; 问题出现在:重复打开多个文件时,会输入异常; 印象中,c++的输入需要flush,于是在关闭流、重新打开文件时候,尝试调用cin.clear,解决;

2、STL的vector在push_back的时候报错 断点调试之后,发现push_back进去的是一个简单的对象,对象也不为空,vector也不为空; 感觉不是push_back的问题,在检查完其他代码的时候,发现其实是因为其他地方访问越界,覆盖到了 vector 申请的内存,导致里面一些用于内存管理的数据被破坏。

STL的坑,不是第一次遇到。

奇思妙想

问题1:CADisplayLink的回调频率是跟CPU的runloop同步,还是渲染的帧率同步? 问题2:如何确定GPU的渲染帧率?

确定一点,CADisplayLink是跟着渲染的帧率走的。 通过写demo进行测试,发现: CADisplayLink跟着屏幕刷新的帧率,如果有大量的CPU任务,导致CPU跑满,导致帧率降低,这时CADisplayLink回调会下降; 如果帧率正常,但业务层每5帧调用一次渲染的指令,则画面会卡顿,CADisplayLink回调还是正常; 铭记一点CADisplayLink是跟着屏幕刷新的帧率,即使我们不传GPU指令,屏幕依旧会刷新,CADisplayLink回调正常。

那么runloop和CADisplayLink以及帧率是什么关系? runloop的每秒执行次数 >= CADisplayLink每秒回调次数 = 帧率 runloop在每个循环中,可能会传若干GPU指令,如果runloop任务过多,导致runloop的每秒执行次数,那么帧率会下降,CADisplayLink回调频率也会下降;此时即使GPU的使用很少,但是帧率仍旧很低。

显示器的显示中会发出HSync和VSync信号,HSync是水平同步信号,VSync是垂直同步信号,iOS会捕捉VSync信号,并在runloop中发送source事件,然后监听这个事件的函数得到回调,这个VSync的频率是固定的,跟着屏幕的固定频率(一般是60Hz),只要CPU有时间,都会捕获这个事件,故而使CADisplayLink得到回调; 但是GPU的渲染帧率与屏幕显示的帧率不一定相同,如果GPU的任务过于繁重,显示内容依旧会卡顿的情况。

如何确定GPU的真实渲染呢? 考虑通过某个线程的timer或者displaylink进行周期性回调,在回调中通过glfinish等阻塞操作来等待gl指令执行完毕;

思考?:这些有什么用呢?

应用上架

1、访问苹果网络异常 错误描述是: A server with the specified hostname could not be found 1、访问苹果网络失败,切换网络; 2、检查下hosts文件; 除非最近修改过hosts文件,不然大概率是问题1;

2、图片不能有alpha 通道 上架App过程中,在上传预览图的时候,提示:图片不能有alpha 通道。 解决方案:打开finder,找到图片,显示简介,这里可以看到图片是否带有alpha通道; 用mac自带的预览打开图片,选择导出,这里可以渲染是否带alpha通道;

3、ipa包上传 收到的警告原文:

WARNING ITMS-90076: "Potential Loss of Keychain Access. The previous version of software has an application-identifier value of ['3JW29ZDFYQ.com.loying.lin'] and the new version of software being submitted has an application-identifier of ['B86YZY7YJX.com.loying.lin']. This will result in a loss of keychain access."

This is a warning, not an error 如果app没有用到keychain、handoff、UIPasteboard sharing可以忽略这个警告,详见原文

4、证书相关 不要随便删除证书(包括开发、发布和推送证书)和Provisioning Profiles文件。 比如说删除push证书,app还能正常使用,但是推送会失效。

那如果是企业证书,已经发布下载,然后删除发布证书呢? 就算已经安装的软件,也会打不开。 因为iOS会定期更新企业证书的有效性,这个时间不确定。

An Internet connection is required to verify the app developer's certificate when establishing trust. If you're behind a firewall, make sure it's configured to allow connections to https://ppq.apple.com. If you aren't connected to the Internet when you trust an app, the device displays "Not Verified" instead. In order to use the app, you need to connect to the Internet, and tap the Verify App button.

这里有一篇很不错的文章 iOS App 签名的原理

5、IAP内购显示 您没有权限在 Sandbox 购买此 InApp RMStore: transaction failed with product com.*.*.3 and error Error Domain=SSServerErrorDomain Code=0 "此时您没有权限在 Sandbox 购买此 InApp。" UserInfo={NSLocalizedDescription=此时您没有权限在 Sandbox 购买此 InApp。 解决方案: 检查沙盒账号是否对应开发者账号 检查是否为release 状态 检查bundle id是否为对应的id 检查银行协议是否正常

6、AppStore审核名字不一致 审核时,名字不一致,苹果回复说:

We continued to find that the app name to be displayed on the App Store and the app name displayed on the device do not sufficiently match, which makes it difficult for users to find the app they just downloaded. The app names are:

  • Name on the App Store: NameA
  • Name displayed on the device: NameB

经过一番严查,才发现问题出现在多语言版本。

debug分析

1、Unknown 崩溃日志 Unknown日志是内存不够回收内存kill应用程序导致Crash; Crash日志是程序异常Crash; Unknown日志的特征是Process和Type都为Unknown。

2、堆栈

代码语言:javascript
复制
0   Live                              0x0000000100410af8 -[MainTabBarController backtrace] + 68,
1   Live                              0x0000000100410934 -[MainTabBarController viewWillAppear:] + 140,
2   UIKit                               0x0000000188dea754 <redacted> + 624,

0x00000001890577ec 是绝对地址; 通过backtrace函数可以打印出系统的堆栈,NSThread也有对应的方法可以打出堆栈; 这里插入一段关于signal方法的内容: sig是传递给signal方法的参数,进程在接收到类型为sig的信号,会出发一个中断,优先执行之前设置的函数,当函数执行结束后再返回执行原来的程序。

Mac OS X相关

1、Mac上使用NTFS移动硬盘 在Mac上使用移动硬盘,可以通过修改Volume的文件,直接访问移动硬盘。 在正常使用一段时间后,突然发现移动硬盘里的照片打不开,很多文件丢失! 那一瞬间是懵逼的,赶紧下载几个文件恢复工具,扫不出来个所以然。(有一个扫得出来,但是收费太贵,要$100) 经过一番思考,猜测是我通过修改Volume的这种方式访问硬盘,导致里面文件目录的索引或者文件数据被OS X搞坏; 找了台win电脑,打开文件夹的时候,显示目录已经损坏。 在一番GG之后,找到一个靠谱的答案: 打开硬盘属性,选项卡,查杀,自动修复。 在折腾了3、4个小时后,终于搞定,在Mac上使用又能看见。 但是在晚上使用的时候,发现Mac又打不开硬盘的目录。 于是又花了很长时间去修复,并决定短时间内不用Mac打开移动硬盘。 如果哪位大侠知道如何让Mac兼容NTFS,求告知。

2、Mac OS X 和 Win7 共享文件夹 1、打开win7的网络和共享中心,点击更改高级共享设置: -启用网络发现; -启用文件和打印机共享; -关闭密码保护共享; 2、打开控制面板,点击账户,启用来宾账户; 3、右键文件夹,共享,点击特定用户,在弹出来的权限控制框,添加Guest用户的读写权限; 4、打开mac的finder,选中左侧的已连接的服务器;( 如果没有这个选项,可以command+,,把已连接的服务器 显示出来) 5、远程打开win7的文件夹,弹出来的登陆框里面选择注册用户,用户名是guest,密码是空

效果图

3、内存清理 128G的Pro,根本经不起开发的折磨,看下图

Xcode占了电脑一半多的空间,这些都是属于可删除部分,还有下面的部分

OmniDiskSweeper和Dr.Cleaner都是很好的清理工具,但是OS X自带的工具也是棒棒的,下图:(点击关于本机->存储空间->管理

总结

最近被ReactNative和AudioUnit所困扰,特别怀念写写业务就能度日的时光。

下一篇
举报
领券