1.請簡單的介紹下APNS發(fā)送系統(tǒng)消息的機(jī)制
APNS優(yōu)勢:杜絕了類似安卓那種為了接受通知不停在后臺喚醒程序保持長連接的行為餐蔬,由iOS系統(tǒng)和APNS進(jìn)行長連接替代
APNS的原理:
1.app向iOS注冊遠(yuǎn)程推送通知
2.iOS向APNS發(fā)送設(shè)備的UDID和app的Bundle Identifier.請求返回設(shè)備令牌(device Token)
3.經(jīng)APNS加密生成一個deviceToken,然后發(fā)送給app
4.app將收到的deviceToken發(fā)送給自己的服務(wù)器
5.服務(wù)器將得到的deviceToken進(jìn)行保存,需要推送時將消息和deviceToken一起發(fā)送給APNS,
6.APNS再通過deviceToken找到用戶,并將消息發(fā)給用戶
2.沙盒目錄結(jié)構(gòu)是怎樣的卓研?各自用于那些場景拱她?
Application:存放程序源文件昙读,上架前經(jīng)過數(shù)字簽名崖技,上架后不可修改
// 打印其路徑:NSLog(@"沙盒路徑:%@",NSHomeDirectory());
1.Documents:(用戶收藏或者設(shè)置)
// 需要保存由應(yīng)用程序本身產(chǎn)生的需要持久化文件或者數(shù)據(jù)擎椰,iTunes同步設(shè)備時會備份該目錄支子。例如:游戲進(jìn)度、涂鴉軟件的繪圖达舒。
// 目錄中的文件會被自動保存在iCloud值朋、iTunes.
// 注意:不要保存從網(wǎng)路上下載的文件叹侄,否則會無法上架。
2.Library(自己緩存文件和SDWebImage緩存圖片)
Caches:存放體積大又不需要備份的數(shù)據(jù)
// 保存臨時文件昨登,后續(xù)需要使用,例如:緩存圖片趾代,離線數(shù)據(jù)(地圖數(shù)據(jù))。
// 系統(tǒng)不會清理cache目錄中的文件丰辣。
// 要求程序開發(fā)時撒强,必須提供Caches目錄的清理解決方案。
Preference:設(shè)置目錄笙什,iCloud會備份設(shè)置信息
// 保存應(yīng)用的所有偏好設(shè)置飘哨,使用NSUserDefault直接讀寫。(賬號密碼)得湘。iTunes會同步設(shè)備時會備份該目錄杖玲。
// 如果要想數(shù)據(jù)及時寫入磁盤,還需要調(diào)用一個同步方法淘正。
// 偏好設(shè)置一般是利用鍵值對保存,本質(zhì)上也是plist文件臼闻,但是不用去找尋地址鸿吆,有對應(yīng)的文件夾,對應(yīng)的方法查詢地址述呐,保存惩淳。
3.tmp:存放臨時文件,不會被備份乓搬,而且這個文件下的數(shù)據(jù)有可能隨時被清除的可能
// 保存臨時文件思犁,后續(xù)不需要使用一般緩存比較大的,不重要的數(shù)據(jù)进肯。
// tmp目錄中的文件激蹲,系統(tǒng)會自動清理。
// 重新啟動手機(jī)江掩,tem目錄會被清空学辱。
// 系統(tǒng)磁盤空間不足時,系統(tǒng)會自動清理环形。
3.pushViewController和presentViewController有什么區(qū)別?
兩者都是在多個試圖控制器間跳轉(zhuǎn)的函數(shù)
presentViewController提供的是一個模態(tài)視圖控制器(modal)
pushViewController提供一個棽咂控制器數(shù)組,push/pop
4.控制器的生命周期抬吟,下面已經(jīng)按方法執(zhí)行順序進(jìn)行了排序
// 自定義控制器view萨咕,這個方法只有實現(xiàn)了才會執(zhí)行
- (void)loadView{
[super loadView];
self.view = [[UIView alloc] init];
self.view.backgroundColor = [UIColor orangeColor];
NSLog(@"--1--%s",__func__);
}
// view是懶加載,只要view加載完畢就調(diào)用這個方法
- (void)viewDidLoad{
[super viewDidLoad];
NSLog(@"沙盒路徑:%@",NSHomeDirectory());
NSLog(@"--2--%s",__func__);
}
// view即將顯示
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
NSLog(@"--3--%s",__func__);
}
// view即將開始布局子控件
- (void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
NSLog(@"--4--%s",__func__);
}
// view已經(jīng)完成子控件的布局
- (void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
NSLog(@"--5--%s",__func__);
}
// view已經(jīng)出現(xiàn)
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"--6--%s",__func__);
}
// view即將消失
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
NSLog(@"--7--%s",__func__);
}
// view已經(jīng)消失
- (void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
NSLog(@"--8--%s",__func__);
}
5.把一個NSNumber類型轉(zhuǎn)換成字符串類型的三種方法?
NSNumber *number = @2;
NSString *str = [NSString stringWithFormat:@"%@",number];
NSString *str1 = [number stringValue];
NSString *str2 = [number description];
6.所謂懶加載,寫的是其get方法,先get再set. 在使用的時候才去初始化
1.懶加載基本概念
懶加載——也稱為延遲加載火本,即在需要的時候才加載(效率低危队,占用內(nèi)存写辖ā)。所謂懶加載交掏,寫的是其get方法.
注意:如果是懶加載的話則一定要注意先判斷是否已經(jīng)有了妆偏,如果沒有那么再去進(jìn)行實例化
2.使用懶加載的好處:
(1)不必將創(chuàng)建對象的代碼全部寫在viewDidLoad方法中,代碼的可讀性更強(qiáng)
(2)每個控件的getter方法中分別負(fù)責(zé)各自的實例化處理盅弛,代碼彼此之間的獨立性強(qiáng)钱骂,松耦合
- (void)viewDidLoad {
// 先get再set
self.label.text = @"懶加載";
}
// 延遲加載
- (UILabel *)label {
// 判斷是否已經(jīng)有了,若沒有挪鹏,則進(jìn)行實例化
if (!_label) {
_label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 40)];
_label.backgroundColor = [UIColor cyanColor];
[self.view addSubview:_label];
}
return _label;
}
7.C和OC冒泡排序
int arr[6] = {2,1,5,6,3,4};
for (int i = 0; i < 6-1; i++) {
for (int j = 0; j < 6-1-i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = 0;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
NSMutableArray *array = [NSMutableArray arrayWithArray:@[@"2",@"1",@"5",@"6",@"3",@"4"]];
NSString *temp;
for (int i = 0; i < array.count; i ++) {
for (int j = 0; j < array.count - 1 - i; j++) {
if ([[array objectAtIndex:j] integerValue] > [[array objectAtIndex:j + 1] integerValue]) {
temp = [array objectAtIndex:j];
[array replaceObjectAtIndex:j withObject:[array objectAtIndex:j + 1]];
[array replaceObjectAtIndex:j + 1 withObject:temp];
}
}
}
8.觸摸事件的傳遞響應(yīng)過程
UIView不能接收觸摸事件的三種情況:
1.不接受用戶交互:userInteractionEnabled = NO;
2.隱藏:hidden = YES;
3.透明:alpha = 0.0~0.01
UIApplication-->UIWindow-->遞歸找到最合適處理的控件-->控件調(diào)用touches方法-->判斷是否實現(xiàn)touches方法-->沒有實現(xiàn)默認(rèn)會將事件傳遞給上一個響應(yīng)者-->找到上一個響應(yīng)者-->...-->UIWindow-->UIApplication-->事件作廢
9.將兩個字符串拼接在一起的方法
NSString *str = @"Hello ";
[NSString stringWithFormat:@"%@%@",str,@" World"];
[str stringByAppendingString:@" World"];
[str stringByAppendingFormat:@"%@%@",str,@" World"];