iOS 小知识相关总结

1.xcode8 去掉繁琐的打印

选择Product->Scheme->Edit Scheme ...或者直接按 command + shift + < 快捷键,在弹出的窗口中Environment Variables 下添加 OS_ACTIVITY_MODE disable如图:

  1. API查看

windows ->documentation and api reference

3.关于block

介绍https://bestswifter.com/oche-swiftbi-bao-dui-bi-zong-jie/

  1. 懒加载:
-(NSMutableArray *)testarray
{
    if(_testarray == nil)
    {
        _testarray = [NSMutableArray array];
    }
    return _testarray;
}

5.判断字符串中是否含有小数点 方案一:

  if ([item.ws_total_amt rangeOfString:@"."].location != NSNotFound) {
        
        NSLog(@"这个字符串中有dian");
        
        number=item.ws_total_amt;
    }else{
        number=[NSString stringWithFormat:@"%@.00",item.ws_total_amt];
    }
在用的时候 一定要 用 [self.testarray  ........] 

方案2:传送门 http://www.cnblogs.com/denz/p/5330771.html
先叙述下我遇到的问题,我的服务器传给我的是一个float的值,作为一个对外的库,由于存在版本延续,需要保留对外的flaot的类型,不改变API,选择进行内部适配。

问题引出

float a = 0.01;
int b = 99999999;
double c = 0.0;
c = a*b;
NSLog(@"%f",c);     //输出结果为 1000000.000000
NSLog(@"%.2f",c);   //输出结果为 1000000.00

//明显不够精确

在网上找到了一个国内朋友的博客也遇到和我一样的问题,他尝试了如下两种解决方案

将float强制转换为double

c = a*(double)b;
NSLog(@"%f",c);     //输出结果  999999.967648
NSLog(@"%.2f",c);   //输出结果  999999.97

// 明显已经丢失精度

通过和NSString的转换,将计算的原始数据转换为纯粹的double类型的数据,这样的计算精度就可以达到要求了

NSString *objA = [NSString stringWithFormat:@"%.2f", a];
NSString *objB = [NSString stringWithFormat:@"%.2f", (double)b];
c = [objA doubleValue] * [objB doubleValue];
NSLog(@"%.2f",c);   //输出结果  999999.99

最终方案

NSString *decimalNumberMutiplyWithString(NSString *multiplierValue,NSString *multiplicandValue)
{
     NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:multiplierValue];
     NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:multiplicandValue];
     NSDecimalNumber *product = [multiplicandNumber decimalNumberByMultiplyingBy:multiplierNumber];
     return [product stringValue];
}
 
NSLog(@"%@",decimalNumberMutiplyWithString([NSString stringWithFormat:@"%f",a], [NSString stringWithFormat:@"%d",b]));

//输出结果  999999.99

6.wkwebview 一些坑 你是否踩过咧??

https://mp.weixin.qq.com/s/rhYKLIbXOsUJC_n6dt9UfA

以及这个人的网站:https://bestswifter.com/

7.单例弊端?

优点:
1:一个类只被实例化一次,提供了对唯一实例的受控访问。
2:节省系统资源
3:允许可变数目的实例。

缺点:
1:一个类只有一个对象,可能造成责任过重,在一定程度上违背了“单一职责原则”。
2:由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
3:滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失

8.介绍下App启动的完成过程?

  1. App启动过程
    • 解析Info.plist
    ▪ 加载相关信息,例如如闪屏
    ▪ 沙箱建立、权限检查

    • Mach-O加载
    ▪ 如果是胖二进制文件,寻找合适当前CPU类别的部分
    ▪ 加载所有依赖的Mach-O文件(递归调用Mach-O加载的方法)
    ▪ 定位内部、外部指针引用,例如字符串、函数等
    ▪ 执行声明为attribute((constructor))的C函数
    ▪ 加载类扩展(Category)中的方法
    ▪ C++静态对象加载、调用ObjC的 +load 函数

    • 程序执行
    · 1.main函数
    · 2.执行UIApplicationMain函数
    ·   1.创建UIApplication对象
    ·   2.创建UIApplicationDelegate对象并复制
    ·   3.读取配置文件info.plist,设置程序启动的一些属性,(关于info.plist的内容可网上搜索下)
    ·   4.创建应用程序的Main Runloop循环
    · 3.UIApplicationDelegate对象开始处理监听到的事件
    ·   1.程序启动成功之后,首先调用application:didFinishLaunchingWithOptions:方法,
    ·   如果info.plist文件中配置了启动storyboard文件名,则加载storyboard文件。
    ·   如果没有配置,则根据代码来创建UIWindow--->UIWindow的rootViewController-->显示

9.怎么防止反编译?

1.本地数据加密
iOS应用防反编译加密技术之一:对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息

2.URL编码加密
iOS应用防反编译加密技术之二:对程序中出现的URL进行编码加密,防止URL被静态分析

3.网络传输数据加密
iOS应用防反编译加密技术之三:对客户端传输数据提供加密方案,有效防止通过网络接口的拦截获取数据

4.方法体,方法名高级混淆
iOS应用防反编译加密技术之四:对应用程序的方法名和方法体进行混淆,保证源码被逆向后无法解析代码

5.程序结构混排加密
iOS应用防反编译加密技术之五:对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低

你可能感兴趣的:(iOS 小知识相关总结)