一 換膚
- 基本的換膚功能實作
- 選中皮膚儲存至系統偏好
// 記錄使用者選中的皮膚
[[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—>選中頭⽂檔案)
- 建立項⺫⽬目測試靜态庫
- 裝置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架構設定
- 模拟器CPU架構:
3.邊開發邊制作靜态庫
- 添加一個靜态庫的targets—>點選項⺫⽬目—>targets—>+
- 測試靜态庫: 項⺫⽬目—>項⺫⽬目的target—>general—>linked framework—>添加靜态庫
- 打包靜态庫—>選中項⺫⽬目靜态庫—>編譯(頭⽂檔案)
4.使⽤用靜态庫的注意點:
- 靜态庫有真機和模拟器(測試階段可以使⽤模拟器,釋出階段使⽤真機)。好處:資源包變⼩
- 靜态庫有Debug版和release版本(測試階段使⽤用Debug,釋出階段使⽤release)。好處:資源包變⼩/運⾏速度變快/代碼進⾏優化
- 調試版本會包含完整的符号資訊,以友善調試
- 調試版本不會對代碼進行優化
- 釋出版本不會包含完整的符号資訊
- 釋出版本的執行代碼是進行過優化的
- 釋出版本的大小會比調試版本的略小
- 在執行速度方面,釋出版本會更快些,但不意味着會有顯著的提升
- 編譯Debug版或release版本靜态庫設定
- StaticLib→Edit Scheme→截圖
-
1>動态庫(預設)
注意:如果項⺫中⽤到了動态庫進⾏設定:項⺫—>項⺫的target—> general— >Embedded—>添加動态庫
-
2>靜态庫
制作靜态庫的修改配置:項⺫—>靜态庫的target—>build setting—>搜尋mach —>static library
-
3>注意點
檢視一個.framework靜态庫⽀持哪些架構:lipo -info framework⽂件下⾯的⼆進制
合并靜态庫:合并framework⽂件下⾯的⼆進制
三 支付寶內建
- 向支付寶申請, 與支付寶簽約,獲得商戶ID(partner)和賬号ID(seller)和私鑰(privateKey)
- 下載下傳支付寶SDK
- 生成訂單資訊,簽名加密
- 調用支付寶用戶端,由支付寶用戶端跟支付寶安全伺服器打交道
- 支付完畢後,支付寶用戶端會自動跳回到原來的應用程式
- 在原來的應用程式中顯示支付結果給使用者看
- 如果使用者沒有安裝支付寶用戶端,直接在應用程式中添加一個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對象需要使用圖檔對象,那麼就會存在多個圖檔對象
- imageName: