一 换肤

  • 基本的换肤功能实现
  • 选中皮肤保存至系统偏好
  // 记录用户选中的皮肤[[NSUserDefaults standardUserDefaults] setObject:skinColor forKey:@"skinColor"];[[NSUserDefaults standardUserDefaults] synchronize];
  • 抽取SkinTools单例,简化视图控制器的皮肤管理工作

    • 多控制器换肤
 + (UIImage *)skinToolWithImageName:(NSString *)imageName{NSString *imageNamePath = [NSString stringWithFormat:@"skin/%@/%@", _skinColor, imageName];return [UIImage imageNamed:imageNamePath];}
 + (void)setSkinColor:(NSString *)skinColor{_skinColor = skinColor;// 记录用户选中的皮肤[[NSUserDefaults standardUserDefaults] setObject:skinColor forKey:@"skinColor"];[[NSUserDefaults standardUserDefaults] synchronize];}
  • 添加TabBar演练皮肤切换
+ (UIColor *)skinToolWithLabelBgColor
{// 1.找到对应背景的plist文件NSString *bgColorFileName = [NSString stringWithFormat:@"skin/%@/BgColor.plist", _skinColor];NSString *bgColorFilePath = [[NSBundle mainBundle] pathForResource:bgColorFileName ofType:nil];// 2.加载背景颜色// 2.1.加载背景字典NSDictionary *bgColorDict = [NSDictionary dictionaryWithContentsOfFile:bgColorFilePath];// 2.2.取出背景颜色的字符串NSString *bgColorString = bgColorDict[@"LabelBgColor"];// 2.3.取出背景颜色的数组(0,255,0)NSArray *bgColorArray = [bgColorString componentsSeparatedByString:@","];// 2.4.取出对应的RGB值NSInteger red = [bgColorArray[0] integerValue];NSInteger green = [bgColorArray[1] integerValue];NSInteger blue = [bgColorArray[2] integerValue];return [UIColor colorWithRed:red / 255.0 green:green / 255.0 blue:blue / 255.0 alpha:1.0];
}
/***  当类第一次使用的时候会调用该方法,该方法只会调用一次*/+ (void)initialize{// 1.先从偏好设置中取出用户之前选中的皮肤_skinColor = [[NSUserDefaults standardUserDefaults] objectForKey:@"skinColor"];// 2.判断skinColor是否为空,如果为空,表示用户之前没有选中皮肤,那么显示蓝色皮肤if (_skinColor == nil) {_skinColor = @"blue";}}

二 静态库

1.介绍静态库

  • 什么是库?

    • 库是程序代码的集合,是共享程序代码的一种方式
  • 根据源代码的公开情况,库可以分为2种类型

    • 开源库
    • 闭源库
      • 静态库
      • 动态库
  • 静态库和动态库的存在形式:

    • 静态库:.a 和 .framework
    • 动态库:.dylib 和 .framework
  • 静态库和动态库在使用上的区别
    • 静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
    • 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存

需要注意的是:项目中如果使用了自制的动态库,不能被上传到AppStore

2.制作.a的静态库(Framework&Library)

  • 包含头⽂文件(项⺫⽬目—>build Phase—>copy File—>选中头⽂文件)

  • 创建项⺫⽬目测试静态库

  • 设备CPU架构—>lipo -info lipo -create 静态库12 -output 静态库

每一个手机都有属于自己的CPU,而每一个CPU都有属于自己的CPU架构(指令集)
每一个静态库都有自己可以支持的架构:

  • 手机和模拟器使用的CPU架构

    • 模拟器CPU架构:

      • iPhone4s–>iphone5 : i386
      • iphone5s–>iphone6s plus : x86_64
    • 真机CPU架构

      • iPhone3gs–>iphone4s : armv7
      • iphone5–>iphone5c : armv7s(如果一个静态库支持armv7架构,也可以跑在架构是armv7s的设备,没有对代码进行优化)
      • iPhone5s–>iPhone6s plus : arm64
    • 查看静态库支持的架构:lipo -info 静态库名称

    • 合并静态库:lipo -create 静态库1 静态库2 -output 新的静态库
    • 编译静态库支持所有模拟器CPU架构设置

3.边开发边制作静态库
- 添加一个静态库的targets—>点击项⺫⽬目—>targets—>+

  • 测试静态库: 项⺫⽬目—>项⺫⽬目的target—>general—>linked framework—>添加静态库

  • 打包静态库—>选中项⺫⽬目静态库—>编译(头⽂文件)

4.使⽤用静态库的注意点:

  • 静态库有真机和模拟器(测试阶段可以使⽤模拟器,发布阶段使⽤真机)。好处:资源包变⼩
  • 静态库有Debug版和release版本(测试阶段使⽤用Debug,发布阶段使⽤release)。好处:资源包变⼩/运⾏速度变快/代码进⾏优化

    • 调试版本会包含完整的符号信息,以方便调试
    • 调试版本不会对代码进行优化
    • 发布版本不会包含完整的符号信息
    • 发布版本的执行代码是进行过优化的
    • 发布版本的大小会比调试版本的略小
    • 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升
  • 编译Debug版或release版本静态库设置

    • StaticLib→Edit Scheme→截图

    5.制作.framework库

    • 1>动态库(默认)
      注意:如果项⺫中⽤到了动态库进⾏设置:项⺫—>项⺫的target—> general— >Embedded—>添加动态库
    • 2>静态库
      制作静态库的修改配置:项⺫—>静态库的target—>build setting—>搜索mach —>static library
    • 3>注意点
      查看一个.framework静态库⽀持哪些架构:lipo -info framework⽂件下⾯的⼆进制
      合并静态库:合并framework⽂件下⾯的⼆进制

三 支付宝集成

  1. 向支付宝申请, 与支付宝签约,获得商户ID(partner)和账号ID(seller)和私钥(privateKey)
  2. 下载支付宝SDK
  3. 生成订单信息,签名加密
  4. 调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道
  5. 支付完毕后,支付宝客户端会自动跳回到原来的应用程序
  6. 在原来的应用程序中显示支付结果给用户看

    • 如果用户没有安装支付宝客户端,直接在应用程序中添加一个WebView,通过网页让用户进行支付
  // 注意:如果是通过网页支付完成,那么会回调该block:callback[[AlipaySDK defaultService] payOrder:orderString fromScheme:@"jingdong" callback:^(NSDictionary *resultDic) {}];
}
  • 通过支付宝
// 当通过别的应用程序,将该应用程序打开时,会调用该方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{// 当用户通过支付宝客户端进行支付时,会回调该block:standbyCallback[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"result = %@",resultDic);}];  return YES;
}
  • 注意报错:找不到路径时添加路径

四 内存分析

  • 1.静态内存分析

    • 不运⾏程序,直接对代码进⾏内存分析,查看代码是否有内存泄露
    • 优点:分析速度快,并且可以对所有的代码进⾏内存
    • 缺点:分析不一定准确(没有运⾏程序,根据代码的上下文语法结构)
    • 注意:如果有提⽰有内存泄露,⼀定结合代码查看代码是否有问题.
  • 2.动态内存分析(会使⽤Instruments对APP进⾏行内存分析)

    • 真正运⾏起来程序,对程序进⾏内存分析(查看内存分配情况/内存泄露)
    • 优点:分析⾮常准确,如果发现有提⽰内存泄露.基本可以断定代码问题
    • 缺点:分析效率低(真正运⾏了⼀段代码,才能对该代码进⾏内存分析)
    • 注意:如果发现有内存泄露,基本需要修改代码(基本有内存泄露)

    • 使⽤Instruments:Product→Profile→打开Instruments工具

    • Allocations:内存分配
    • Leaks: 内存泄露
  • 2种加载图片方法对比:

    • imageName:

      • 1.加载的图片不会随着对象的销毁
      • 2.如果多个UIImage对象需要使用图片对象,图片对象只会存在一份
    • imageContentOfFile:
      • 1.加载的图片会随着对象的销毁一起销毁
      • 2.如果多个UIImage对象需要使用图片对象,那么就会存在多个图片对象

iOS开发实用技术之换肤和静态库相关推荐

  1. ANE的开发需求一般太少,这个静态库如何包含第三方

    1.介绍 原本不打算在分开发一遍这个的,应该是包含在这篇Flash Air ANE for iOS 集成最新版本的友盟统计SDK.framework功能中的,但是由于ANE的开发需求一般太少,这个静态 ...

  2. Android 主题换肤的开源库

    Android 主题换肤的开源库(插件化换肤) 新增夜间模式的简洁实现方式,不需要再去单独创建一个皮肤包(目前处于beta版本) 夜间模式实现方式 前提条件还是每个使用到的资源必须是引用的,不能是具体 ...

  3. iOS端实现节日换肤

    本文是我在网上看到一篇不错的文章,因为之前没接触过,所以特意转过来,和大家一起分享下.. 以下正文: 一.问题的提出 不知道大家有没有发现, 元旦期间, 很多APP界面里的图标都换成了具有节日气氛的样 ...

  4. iOS开发实用技术之二维码

    一. 二维码生成和扫描 1. 二维码概念 二维码, 是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的; 2. 二维码的使用场景 ● 信息获取(名片.地图.WI ...

  5. Android插件化开发实现动态换肤

    今晚实在不想coding,于是想着整理点知识点,那么简单整理了下插件化开发实现动态更换皮肤.插件化开发大家应该不陌生或多或少用过或听过,插件化开发在项目业务拓展.模块化等方面有不小优势,当然实现一个完 ...

  6. iOS开发实用技术之推送-应用间跳转-社交分享

    实用补充 --- 一. 推送通知 1. 什么是推送通知? > 首先明确:**此处的推送通知跟我们的"NSNotification"没有半毛钱关系> 可以理解为: 向用户 ...

  7. iOS开发实用技术之MapKit框架的使用

    MapKit框架的使用 ---- 一. 地图的基本使用 1. 设置地图显示类型 地图的样式可以手动设置, 在iOS9.0之前有3种, iOS9.0之后增加了2种 设置方式 self.mapView.m ...

  8. iOS开发实用技术之音频播放(QQ音乐)

    音频播放 --- 一. 录音 0. 应用场景 大多数应用在即时通讯APP中, 语音发送 1. 录音步骤 导入AVFoundation框架 #import <AVFoundation/AVFoun ...

  9. iOS开发实用技术之传感器

    一 传感器 什么是传感器 传感器是一种感应\检测周围环境的一种装置 传感器的作用 用于感应\检测设备周边的信息 不同类型的传感器, 检测的信息也不一样 iPhone内置的传感器有 运动传感器\加速度传 ...

最新文章

  1. [转]url传递中文的解决方案总结
  2. 游戏助手APP软件带网站源码
  3. Java并发编程框架Disruptor
  4. Qt 动图 播放png阵列 避免使用gif导致失真
  5. 单片机C51继电器控制C语言,单片机控制继电器,51单片机控制继电器详细说明
  6. TeamTalk 单服务端配置
  7. 计算机mod函数,MOD函数的公式语法及使用方法实例
  8. 计算机文献信息检索发展的最高阶段,文献检索作业答案.doc
  9. 4月日本旅游签证简化办理攻略分享
  10. 容器 I/O 性能诊断:到底哪个应用是带宽杀手?
  11. Hbuilder开发移动新闻客户端(二)
  12. 关于奋斗的150条中国名人名言
  13. 湮没在先秦的【文士道】精神
  14. SQL Server 数据库实验课第七周——授权:授予与收回
  15. openCV学习-day02--如何计算图像色彩种类
  16. 2、软件测试生命周期以及流程
  17. QT undefined reference to `xxxr,缺失系统库的解决方案
  18. 创业必须知道的----注册公司的流程和所需材料
  19. Python自动操作 GUI 神器——PyAutoGUI
  20. DaisyDisk怎样以管理员身份扫描磁盘或文件夹

热门文章

  1. MYSQL数据库GTID实现主从复制(超级方便)
  2. itext转换html成pdf(支持中文、图片)
  3. 鸿蒙os手机版,魅族霸气官宣加入!但魅族手机依旧无缘鸿蒙OS:鸿蒙新品让人意外...
  4. 职务与职级并行套改表_职务职级并行套改细则有哪些变化?2019职务与职级并行实施细则...
  5. APMServ相关(AllowOverride)
  6. 上下文可编程区块链——以太坊的未来
  7. Windows安全中心 你的IT管理员已限制对此应用的区域的访问
  8. Linux 新手必知必会的 10 条 Linux 基本命令
  9. 大数据综合案例--搜狗搜索日志分析
  10. 别躲!系统里的密码特工