天天看點

iOS開發實用技術之換膚和靜态庫

一 換膚

  • 基本的換膚功能實作
  • 選中皮膚儲存至系統偏好
// 記錄使用者選中的皮膚
  [[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[] integerValue];
    NSInteger green = [bgColorArray[] integerValue];
    NSInteger blue = [bgColorArray[] integerValue];

    return [UIColor colorWithRed:red /  green:green /  blue:blue /  alpha:];
}
           
/**
 *  當類第一次使用的時候會調用該方法,該方法隻會調用一次
 */
 + (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—>選中頭⽂檔案)
    iOS開發實用技術之換膚和靜态庫
  • 建立項⺫⽬目測試靜态庫
  • 裝置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架構設定
      iOS開發實用技術之換膚和靜态庫

3.邊開發邊制作靜态庫

- 添加一個靜态庫的targets—>點選項⺫⽬目—>targets—>+

iOS開發實用技術之換膚和靜态庫
  • 測試靜态庫: 項⺫⽬目—>項⺫⽬目的target—>general—>linked framework—>添加靜态庫
    iOS開發實用技術之換膚和靜态庫
  • 打包靜态庫—>選中項⺫⽬目靜态庫—>編譯(頭⽂檔案)
    iOS開發實用技術之換膚和靜态庫

4.使⽤用靜态庫的注意點:

  • 靜态庫有真機和模拟器(測試階段可以使⽤模拟器,釋出階段使⽤真機)。好處:資源包變⼩
  • 靜态庫有Debug版和release版本(測試階段使⽤用Debug,釋出階段使⽤release)。好處:資源包變⼩/運⾏速度變快/代碼進⾏優化
    • 調試版本會包含完整的符号資訊,以友善調試
    • 調試版本不會對代碼進行優化
    • 釋出版本不會包含完整的符号資訊
    • 釋出版本的執行代碼是進行過優化的
    • 釋出版本的大小會比調試版本的略小
    • 在執行速度方面,釋出版本會更快些,但不意味着會有顯著的提升
  • 編譯Debug版或release版本靜态庫設定
    • StaticLib→Edit Scheme→截圖
      iOS開發實用技術之換膚和靜态庫
    5.制作.framework庫
    • 1>動态庫(預設)

      注意:如果項⺫中⽤到了動态庫進⾏設定:項⺫—>項⺫的target—> general— >Embedded—>添加動态庫

      iOS開發實用技術之換膚和靜态庫
    • 2>靜态庫

      制作靜态庫的修改配置:項⺫—>靜态庫的target—>build setting—>搜尋mach —>static library

      iOS開發實用技術之換膚和靜态庫
    • 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;
}
           
  • 注意報錯:找不到路徑時添加路徑
    iOS開發實用技術之換膚和靜态庫

四 記憶體分析

  • 1.靜态記憶體分析
    • 不運⾏程式,直接對代碼進⾏記憶體分析,檢視代碼是否有記憶體洩露
    • 優點:分析速度快,并且可以對所有的代碼進⾏記憶體
    • 缺點:分析不一定準确(沒有運⾏程式,根據代碼的上下文文法結構)
    • 注意:如果有提⽰有記憶體洩露,⼀定結合代碼檢視代碼是否有問題.
  • 2.動态記憶體分析(會使⽤Instruments對APP進⾏行記憶體分析)
    • 真正運⾏起來程式,對程式進⾏記憶體分析(檢視記憶體配置設定情況/記憶體洩露)
    • 優點:分析⾮常準确,如果發現有提⽰記憶體洩露.基本可以斷定代碼問題
    • 缺點:分析效率低(真正運⾏了⼀段代碼,才能對該代碼進⾏記憶體分析)
    • 注意:如果發現有記憶體洩露,基本需要修改代碼(基本有記憶體洩露)
    • 使⽤Instruments:Product→Profile→打開Instruments工具
    • Allocations:記憶體配置設定
    • Leaks: 記憶體洩露
  • 2種加載圖檔方法對比:
    • imageName:
      • 1.加載的圖檔不會随着對象的銷毀
      • 2.如果多個UIImage對象需要使用圖檔對象,圖檔對象隻會存在一份
    • imageContentOfFile:
      • 1.加載的圖檔會随着對象的銷毀一起銷毀
      • 2.如果多個UIImage對象需要使用圖檔對象,那麼就會存在多個圖檔對象