1.請簡單的介紹下APNS發送系統消息的機制
APNS優勢:杜絕了類似安卓那種為了接受通知不停在后臺喚醒程序保持長連接的行為,由iOS系統和APNS進行長連接替代
APNS的原理:
1.app向iOS注冊遠程推送通知
2.iOS向APNS發送設備的UDID和app的Bundle Identifier.請求返回設備令牌(device Token)
3.經APNS加密生成一個deviceToken,然后發送給app
4.app將收到的deviceToken發送給自己的服務器
5.服務器將得到的deviceToken進行保存,需要推送時將消息和deviceToken一起發送給APNS,
6.APNS再通過deviceToken找到用戶,并將消息發給用戶
2.沙盒目錄結構是怎樣的?各自用于那些場景?
Application:存放程序源文件,上架前經過數字簽名,上架后不可修改
// 打印其路徑:NSLog(@"沙盒路徑:%@",NSHomeDirectory());
1.Documents:(用戶收藏或者設置)
// 需要保存由應用程序本身產生的需要持久化文件或者數據,iTunes同步設備時會備份該目錄。例如:游戲進度、涂鴉軟件的繪圖。
// 目錄中的文件會被自動保存在iCloud、iTunes.
// 注意:不要保存從網路上下載的文件,否則會無法上架。
2.Library(自己緩存文件和SDWebImage緩存圖片)
Caches:存放體積大又不需要備份的數據
// 保存臨時文件,后續需要使用,例如:緩存圖片,離線數據(地圖數據)。
// 系統不會清理cache目錄中的文件。
// 要求程序開發時,必須提供Caches目錄的清理解決方案。
Preference:設置目錄,iCloud會備份設置信息
// 保存應用的所有偏好設置,使用NSUserDefault直接讀寫。(賬號密碼)。iTunes會同步設備時會備份該目錄。
// 如果要想數據及時寫入磁盤,還需要調用一個同步方法。
// 偏好設置一般是利用鍵值對保存,本質上也是plist文件,但是不用去找尋地址,有對應的文件夾,對應的方法查詢地址,保存。
3.tmp:存放臨時文件,不會被備份,而且這個文件下的數據有可能隨時被清除的可能
// 保存臨時文件,后續不需要使用一般緩存比較大的,不重要的數據。
// tmp目錄中的文件,系統會自動清理。
// 重新啟動手機,tem目錄會被清空。
// 系統磁盤空間不足時,系統會自動清理。
3.pushViewController和presentViewController有什么區別?
兩者都是在多個試圖控制器間跳轉的函數
presentViewController提供的是一個模態視圖控制器(modal)
pushViewController提供一個棧控制器數組,push/pop
4.控制器的生命周期,下面已經按方法執行順序進行了排序
// 自定義控制器view,這個方法只有實現了才會執行
- (void)loadView{
[super loadView];
self.view = [[UIView alloc] init];
self.view.backgroundColor = [UIColor orangeColor];
NSLog(@"--1--%s",__func__);
}
// view是懶加載,只要view加載完畢就調用這個方法
- (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已經完成子控件的布局
- (void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
NSLog(@"--5--%s",__func__);
}
// view已經出現
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"--6--%s",__func__);
}
// view即將消失
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
NSLog(@"--7--%s",__func__);
}
// view已經消失
- (void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
NSLog(@"--8--%s",__func__);
}
5.把一個NSNumber類型轉換成字符串類型的三種方法?
NSNumber *number = @2;
NSString *str = [NSString stringWithFormat:@"%@",number];
NSString *str1 = [number stringValue];
NSString *str2 = [number description];
6.所謂懶加載,寫的是其get方法,先get再set. 在使用的時候才去初始化
1.懶加載基本概念
懶加載——也稱為延遲加載,即在需要的時候才加載(效率低,占用內存小)。所謂懶加載,寫的是其get方法.
注意:如果是懶加載的話則一定要注意先判斷是否已經有了,如果沒有那么再去進行實例化
2.使用懶加載的好處:
(1)不必將創建對象的代碼全部寫在viewDidLoad方法中,代碼的可讀性更強
(2)每個控件的getter方法中分別負責各自的實例化處理,代碼彼此之間的獨立性強,松耦合
- (void)viewDidLoad {
// 先get再set
self.label.text = @"懶加載";
}
// 延遲加載
- (UILabel *)label {
// 判斷是否已經有了,若沒有,則進行實例化
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.觸摸事件的傳遞響應過程
UIView不能接收觸摸事件的三種情況:
1.不接受用戶交互:userInteractionEnabled = NO;
2.隱藏:hidden = YES;
3.透明:alpha = 0.0~0.01
UIApplication-->UIWindow-->遞歸找到最合適處理的控件-->控件調用touches方法-->判斷是否實現touches方法-->沒有實現默認會將事件傳遞給上一個響應者-->找到上一個響應者-->...-->UIWindow-->UIApplication-->事件作廢
響應過程.png
9.將兩個字符串拼接在一起的方法
NSString *str = @"Hello ";
[NSString stringWithFormat:@"%@%@",str,@" World"];
[str stringByAppendingString:@" World"];
[str stringByAppendingFormat:@"%@%@",str,@" World"];