
模態(tài)
- 使用場(chǎng)景:
1.調(diào)用系統(tǒng)相冊(cè)
2.相機(jī)
3.臨時(shí)展示一些內(nèi)容(例如用戶登錄頁面,通信錄添加聯(lián)系人)
UIKit 提供的一些專門用于模態(tài)顯示的ViewController,比如UIImagePicekerController等
主要用途:
1.收集用戶輸入信息
2.臨時(shí)呈現(xiàn)一些內(nèi)容
3.臨時(shí)改變工作模式
4.相應(yīng)設(shè)備方向變化
5.顯示一個(gè)新的view層級(jí)
- 彈出風(fēng)格 Modal Presentation Style
1.UIModalPresentationFullScreen : 充滿屏幕
2.UIModalPresentationPageSheet : 代表presentedVC的高度和當(dāng)前屏幕高度響度,寬度和豎屏寬度相同
3.UIModalPresentationFormSheet : 高度寬度均小于屏幕尺寸,居中顯示,四周變暗區(qū)域
4.UIModalPresentationCurrentContext : 與父VC方式相同
- 彈出時(shí)的動(dòng)畫風(fēng)格 Modal Transition Style
1.UIModalTransitionStyleCoverVertical : 從底部劃入
2.UIModalTransitionStyleFlipHorizontal : 水平翻轉(zhuǎn)
3.UIModalTransitionStyleCrossDissolve :交叉溶解
4.UIModalTransitionStylePartialCurl 翻頁
代碼示例:下面代碼是模態(tài)到一個(gè)視圖
第一個(gè)yes表示,模態(tài)的時(shí)候有動(dòng)畫效果
[self presentViewController:modalView animated:YES completion:nil];
代碼示例:下面代碼作用就是將彈出的模態(tài)視圖移除,
第一個(gè)yes表示移除的時(shí)候有動(dòng)畫效果,
第二參數(shù)是設(shè)置一個(gè)回調(diào)block,當(dāng)模態(tài)視圖移除消失后,會(huì)回到這里,可以設(shè)為nil
[self dismissViewControllerAnimated:YES completion:^{ }]
單例
單例是一種設(shè)計(jì)模式
實(shí)現(xiàn) : 定義一個(gè)單例類, 保證程序中這個(gè)類智能創(chuàng)建唯一的實(shí)例對(duì)象,實(shí)現(xiàn)資源共享(最起步的通訊錄或者是記事本可以用)
- 單 : 代表的是唯一性,
- 例: 代表的是實(shí)例對(duì)象.即使用某一個(gè)類創(chuàng)建的對(duì)象是程序中唯一的實(shí)例對(duì)象
注 : 通常每次使用alloc創(chuàng)建的都是不同的對(duì)象
如果一個(gè)類只能創(chuàng)建一個(gè)對(duì)象,那么稱為單例類.單例類可以使工具類,視圖類,控制器類
主要優(yōu)點(diǎn):
1:提供了對(duì)唯一實(shí)例的受控訪問
2:由于在系統(tǒng)內(nèi)存中只存在一個(gè)對(duì)象,因此可以節(jié)約系統(tǒng)資源,對(duì)于一些需要頻繁創(chuàng)建和銷毀的對(duì)象,單例模式可以提高系統(tǒng)性能
3:允許可變數(shù)目的實(shí)例.
缺點(diǎn):
1:由于單例模式中沒有抽象層,因此單例類擴(kuò)展有很大的困難
2:單例類職責(zé)繁重,在一定程度上違背了單一職責(zé)
3:濫用單例將帶來一些負(fù)面問題,例如:為了節(jié)省資源將數(shù)據(jù)庫連接池對(duì)象設(shè)計(jì)為單例類,可能會(huì)導(dǎo)致共享連接池對(duì)象的程序過多而出現(xiàn)連接溢出,如果實(shí)例化對(duì)象長(zhǎng)時(shí)間不利用,系統(tǒng)會(huì)認(rèn)為是垃圾被回收(這里不是指垃圾回收機(jī)制,而是iOS的引用計(jì)數(shù)),導(dǎo)致獨(dú)享狀態(tài)丟失
實(shí)現(xiàn)代碼
#import "DataHandle.h"
static DataHandle *dataHandle = nil;
@implementation DataHandle
//單例實(shí)現(xiàn)方式
+(DataHandle *)shareData
{
if (!dataHandle)
{
dataHandle = [DataHandle new];
}
return dataHandle;
}
//懶加載
-(NSMutableDictionary *)personDic
{
if (_personDic == nil)
{
_personDic = [NSMutableDictionary dictionary];
}
return _personDic;
}
盡量少創(chuàng)建單例
- 懶加載: 懶加載也被成為一宗延遲加載,即在需要的時(shí)候才去加載 (效率高,占用內(nèi)存小),懶加載其實(shí)寫的就是他的getter方法 注意: 如果懶加載的話,那么一定要注意先判斷是否已經(jīng)存在 ,如果沒有再去 進(jìn)行實(shí)例化
- 懶加載 好處 :
- 不必將創(chuàng)建出的對(duì)象的代碼全部都寫在viewDidLoad, 代碼的可讀性更強(qiáng)
- 每個(gè)控件的getter方法中分別負(fù)責(zé)鴿子的實(shí)例化處理,代碼彼此之間的獨(dú)立性更強(qiáng),耦合度更低
- 考慮線程問題和單例訪問的唯一性 單例標(biāo)準(zhǔn)寫法改進(jìn)
static DataHandle *dataH = nil;
-(instancetype )standDataHandle{
// 線程安全 只允許一個(gè)去訪問
@synchronized(self) {
if (!dataHandle)
{
dataHandle = [[DataHandle alloc] init];
}
} return dataHandle;
}
// 第二種:
+ (instancetype)sharedDataHandle{
static DataHandle *dataH = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dataH = [[DataHandle alloc] init]; });
return dataH;
}