开发问题汇总和笔记

一 在苹果的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操作,而且默认是在主线程中进行,在界面滑动中,可能会内存会飙升,引起出现闪退,甚至手机机身发烫的恶劣情况.

开发问题汇总和笔记_第1张图片
UIwebvie因弹出PickView引起的崩溃

十二 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的支持。


开发问题汇总和笔记_第2张图片
js方法

 十五  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

你可能感兴趣的:(开发问题汇总和笔记)