一 在苹果的api中,NSInteger是个封装,它会自动识别当前操作系统的位数,返回最大数据类型,CGFloat在32位数是float 在64位位double,对于需要兼容的程序而言,需要用到CGFloat ,当然从长久考虑尽量使用CGFloat 尽管32位上相比float增加了一些menory footprint的销毁
二 CFindex;在core Foundation 框架中一般用于数组的序号和参数的返回值的大小,位数随着机器的位数增加而增加,和int位数无关
三 iOS- "_OBJC_CLASS_$_WKWebView", referenced from:
解决方法: 在对ios8以上系统引进WK框架时候,还需要适配ios7出现的错误,若最低版本试ios8,没有这个错误,解决办法是需要导入webkit框
四 Swift Struct 和 Class相同点和不同点
相同点:
1 定义属性用于存储值
2 定义方法用于提供功能
3 定义附属脚本用于访问值
4 定义构造器用于生成初始值
5 通过扩展以增加默认实现的功能
6 通过协议以对某类提供标准功能
Class附加的功能
1 类允许被继承
2 类型转换允许在运行时检查和解释一个类实例的类型
3 允许一个类实例释放任何所被分配的资源
4 引用计数允许对一个类的多次引用
与 Objective-C 语言不同的是,Swift 允许直接设置结构体属性的子属性
在 Swift 中,所有的结构体和枚举类型都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。
Swift 中,许多基本类型,诸如String,Array和Dictionary类型均以结构体的形式实现。这意味着被赋值给新的常量或变量,或者被传入函数或方法中时,它们的值会被拷贝。
Objective-C 中NSString,NSArray和NSDictionary类型均以类的形式实现,而并非结构体。它们在被赋值或者被传入函数或方法时,不会发生值拷贝,而是传递现有实例的引用。
在 Objective-C 中,你只能为 Objective-C 的类类型(classes)定义类型方法(type-level methods)。在 Swift 中,你可以为所有的类、结构体和枚举定义类型方法。每一个类型方法都被它所支持的类型显式包含。
Swift 中的错误处理和其他语言中用try,catch和throw进行异常处理很像。和其他语言中(包括 Objective-C )的异常处理不同的是,Swift 中的错误处理并不涉及解除调用栈,这是一个计算代价高昂的过程。就此而言,throw语句的性能特性是可以和return语句相媲美的。
五 Taggend Pointer
在2013年9月,苹果推出iPhone5s,与此同时,5s搭载采用64位的a7处理器 为了节省内存和执行效率,苹果推出Taggend Pointer概念,对于64位系统,引入Tagged Pointer后,相关逻辑内存减少一半内存,以及3倍的速度.就是把一个对象拆分成2部分,一部分直接保存数据,另一部分作为特殊标记,表示一个特殊的指针,不指向任何地址 在Taggend Pointer 对象中没有isa指针,因为它没有真正对象.
六 Multiple methods named 'count:' found with mismatched result, parameter type or attributes,意思是方法命名冲突,编译器找不到合适的方法用在这里,这是在ARC环境下才会出现的问题,非ARC就没有这个问题,解决的方法有两个,1,把程序改成非ARC,但是这样工作量会很大,尤其是对一些大的项目来说很难实现,2,在函数前面强转一下,告诉编译器到什么地方调用合适的方法,比如在这个程序里我的解决办法就是[(NSMutableArray*)[LetterResultArr objectAtIndex:section] count],这样就没错了
七 label同时设置sizeToFit,NSTextAlignmentCenter不起作用
入坑好长时间原因详见:https://stackoverflow.com/questions/28579776/nstextalignmentcenter-for-uilabel-not-working/35066864#35066864?newreg=725179871da349d698d31b72bdbb3565
解决办法:
sizeTofit方法调用必须在创建label frame之前,不能调换位置,alignment属性同样也是写在frame之前,具体写法详见如下:
NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc] initWithString:tcinfo]; NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.alignment = NSTextAlignmentCenter; [paragraphStyle setLineSpacing:4]; [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [tcinfo length])]; CGRect cardRect = [tcinfo boundingRectWithSize:CGSizeMake(self.frame.size.width - 10, MAXFLOAT) options: NSStringDrawingUsesLineFragmentOrigin |NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:gxAlterconectLable.font} context:nil]; [gxAlterconectLable sizeToFit]; gxAlterconectLable.frame = CGRectMake(5, self.frame.size.height/3.0, self.frame.size.width - 10, cardRect.size.height); [self addSubview:gxAlterconectLable]; [gxAlterconectLable setAttributedText:attributedString];
八 iOS 常见的卡顿:
1 CPU卡顿:
原因:App主线程在CPU中显示内容,比如布局计算,图形解码,文本绘制等,随后CPU把计算好的结果提交给GPU(图形处理器),由GPU进行交换,合成,渲染,随后GPU会把渲染结果提交到帧缓冲区,等待下个垂直同步信号到来时显示到屏幕上,由于垂直同步机制,在垂直同步机制时间内,CPU或者GPU没有完成提交,则那一帧会被丢弃,等待下一次机会显示,则这个时候显示屏因为没有新的刷新,会保留之前的内容不变,就会造成卡顿.
优化
* 尽量使用轻量级的对象.
* 不要频繁使用UIView的相关属性,如frame,bounds,transform等属性,测试发现在UITabView上频繁的创建视图,修改视图的frame等会造成32位系统机器卡顿,64位系统的不怎么明显,UITabView使用频繁,各种奇葩的需求,我们是在使用它时往往忽略了UITabView的性能.找工作面试官会问到UITabView的性能优化相关的问题.
* 图片的size最好和UIimageView的size保持一致,尽量不要做等比例压缩等操作.
* 尽量把耗时的操作放在子线程中,比如网络请求用block轻量级子线程完成,UI在主线程刷新.
2 GPU卡顿优化
* 尽量避免在短时间内加载大量的图片,尽可能将多张图片合成一张图片显示
* 尽量减少视图层级和数量
* 减少透明的视图(alpha<1),不透明的设置opaque为YES
* 尽量避免初选离屏渲染:
在openGL中,GPU渲染有2种渲染方式
(1) On - Screen Rendering :当前屏幕渲染
(2) Off - Screen Rendering : 离屏渲染
离屏渲染消耗的原因:
(1) 需要创建新的缓冲区
(2) 离屏渲染需要多次切换上下文环境,先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕.
那些操作会引起离线渲染?
* 光栅化:layer.shouldRasterize = YES
* 遮罩:layer,mask
*圆角,同时设置masksToBounds = YES
*阴影:layer.shadow,但是设置了layer.shadowPath就不会产生离屏渲染
九 WKWebview返回h5首页
[self.webView goToBackForwardListItem:self.webView.backForwardList.backList.firstObject];
入坑记:
参考安卓的方法:
while (self.webView.canGoBack) { [self.webView goBack]; }
测试发现while为死循环
十 特殊闪退问题
malloc: *** error for object 0x7f9776e12150: double free*** set a breakpoint in malloc_error_break to debug
十一 图片的解压缩
将压缩图片数据解码成未压缩图片的位图形式,这是个一个非常耗时的cpu操作,而且默认是在主线程中进行,在界面滑动中,可能会内存会飙升,引起出现闪退,甚至手机机身发烫的恶劣情况.
十二 UIwebview因PickView的数组越界崩
最近有用户反馈,h5界面常有有些选择器(如地市的选择),当h5界面异常的时候,点击弹出选择器,滑动PickView会崩溃,发现这是UIwebview的引起数组越界的bug,UIwebview内部闪退;客户端没法捕捉这个异常,待着好奇心,用WK,发现没有闪退,更换WK;没有对比,就没有伤害,更换WK看样子已经迫在眉睫了
十三 iframe标签在ios失效和界面闪动问题
详见博客:https://blog.csdn.net/qq_28292937/article/details/78853921
https://blog.csdn.net/XinZhongYi/article/details/5518860
十四 引述cnBeta的消息,苹果今天在其WebKit博客上宣布,他们将从2020年3月开始终止对TLS 1.0和1.1的支持。
十五 window.histroy.back 在iOS上无法后退
参考文章:http://www.it1352.com/550444.html https://bbs.csdn.net/topics/392067078?page=1
十六 iOS11 app内自动连接WiFi
ios11 提供了NEHotspotConfigurationManager类直连周边WiFi
引入:NetworkExtension
Xcode - Capabilities - Hostpot Configuration 勾选
if (@available(iOS 11.0, *)) { NEHotspotConfiguration * hotspotConfig = [[NEHotspotConfiguration alloc] initWithSSID:@"Deli_L1050ADNW_1B0000"]; // 开始连接 (调用此方法后系统会自动弹窗确认) [[NEHotspotConfigurationManager sharedManager] applyConfiguration:hotspotConfig completionHandler:^(NSError * _Nullable error) { NSLog(@"%@",error); if (error && error.code != 13 && error.code != 7) { }else if(error.code ==7){//error code = 7 :用户点击了弹框取消按钮 }else{// error code = 13 :已连接 } }]; } else { // iOS11以下版本逻辑 }
十七
sms://106585185001&body=32018132;2;1:1:1;02,14,15,16,18,21^04
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:nil]]无法打开短信,原因是特殊字符^造成的需要将^编码即可
十八
检测ios工程是否有p3照片或者16-bit照片的方法
1 .ipa文件解压得到Payload文件夹
2 终端cd your.app
3 用find命令定位Assert.car文件:终端输入:find . -name 'Assets.car'
4 assertutil 命令知道包含16-bit or p3的资源
sudo xcrun --sdk iphoneos assetutil --info ./Assets.car > /tmp/Assets.json
5 打开/tmp/Assets.json open /tmp/Assets.json