本文參考 標哥的部落格:寶庫iOS開發筆試題 進行學習整理。與其說是看面試題,不如說是對自己知識的鞏固。工欲善其事必先利其器,基礎知識不牢固可能會導致程式設計中的一些注意不到的問題。總之一句話:活到老,學到老。
1.陣列中的元素去重問題。
//重複元素 NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"1",@"2",@"3",nil]; NSMutableArray *marray = [NSMutableArray arrayWithCapacity:array.count]; //比較笨的方法 遍歷迴圈 [array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (![marray containsObject:obj]) { [marray addObject:obj]; } }]; NSLog(@"%@",marray); //通過 KVC 的這個 distinctUnionOfObjects.self 去重,不過順序會亂 // array = [array valueForKeyPath:@"@distinctUnionOfObjects.self"]; // NSLog(@"%@",array); // // //沒有順序,通過dictionary去重 // NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:array.count]; // [array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { // [dict setValue:obj forKey:obj]; // }]; // NSArray *newArray = dict.allValues; // NSLog(@"%@",newArray); // //排序 // newArray = [newArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { // NSString *item1 = obj1; // NSString *item2 = obj2; // return [item1 compare:item2 options:NSLiteralSearch]; // }]; // NSLog(@"%@",newArray); // // //利用NSSet 無順序 // NSSet *set = [NSSet setWithArray:array]; // NSArray *newArray = [set allObjects]; // NSLog(@"%@",newArray); // // // //利用NSOrderSet,直接排序了 // NSOrderedSet *orderSet = [NSOrderedSet orderedSetWithArray:array]; // NSArray *newArray = orderSet.array; // NSLog(@"%@",newArray);
2.NSArray、NSSet、NSDictionary與NSMutableArray、NSMutableSet、NSMutableDictionary 的特性和作用
3.日期格式化的問題
NSDate *date = [NSDate date]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; //設定date格式 formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; NSString *strDate = [formatter stringFromDate:date]; //NSDate *date1 = [formatter dateFromString:strDate]; NSLog(@"%@",strDate);
4.在App中混合HTML5開發App如何實現的。在App中使用HTML5的優缺點是什麼?
(1)HTML5 頁面更新的時候不需要重新發布,只需要更新伺服器的頁面就可以了。
(2)HTML5 頁面巢狀在 WKWebView 裡面 使用,原生App可以和HTML5裡面的元素互相呼叫
(3)HTML5 頁面顯示不如App流暢。
5.描述一下iOS的記憶體管理,在開發中對於記憶體的使用和優化包含哪些方面。我們在開發中應該注意哪些問題。
6.plist檔案是用來做什麼的。一般用它來處理一些什麼方面的問題。
Plist檔案通常用於儲存使用者設定,也可以用於儲存捆綁的資訊,比如儲存一些死資料,城市,商品類別之類的東西。不需要經常從伺服器更新。
7.請簡單寫出增、刪、改、查的SQL語句。
對於經常做CURD的我,這個就比較簡單了。 就是 select ,insert,update,delete 幾個關鍵字,當然SQL還有很多更加複雜的操作。
(1)SELECT * FROM TABLE_NAME WHERE EXPRESSION
(2)INSERT INTO TABLE_NAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1,VALUE2,VALUE3)
(3)UPDATE TABLE_NAME SET FIELD1=VALUE1,FIELD2=VALUE2 WHERE EXPRESSION
(4)DELETE FROM TABLE_NAME WHERE EXPRESSION
8.請寫出UIViewController的完整生命週期
sub loadView
sub viewDidLoad
main viewWillDisappear
sub viewWillAppear
sub viewDidAppear
main viewDidDisappear
sub viewWillDisappear
main viewWillAppear
main viewDidAppear
sub viewDidDisappear
sub dealloc
9.請寫出有多少有方法給UIImageView新增圓角?
10.請描述事件響應者鏈的工作原理
11.如何避免使用block時發生迴圈引用
常用的方法有將self改為弱引用 __weak typeof(self) *weakSelf = self;或者新增 __unsafe_unretained修飾。 然後在block裡面使用weakSelf 。
還有如果要在block裡面改外邊的值,需要加__block 修飾 或者將變數設定為static
12.請比較GCD與NSOperation的異同
13.請寫出NSTimer使用時的注意事項(兩項即可)
- NSTimer在UITableViewCell中使用是,需要將timer加到runLoop中。
countDownTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(countDown:) userInfo:nil repeats:YES]; NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop]; [currentRunLoop addTimer:countDownTimer forMode:NSRunLoopCommonModes];
- 同一個timer在重複使用之前必需invalidate, 否則會造成之前的timer無法停掉,兩個timer同時存在。導致的現象就是timer同時更新兩次。
14.說說Core Animation是如何開始和結束動畫的
15.iOS中快取一定量的資料以便下次可以快速執行,那麼資料會儲存在什麼地方,有多少種儲存方式?
- 偏好設定 NSUserDefaults
- plist檔案
- Core Data
- SqlLite
- 歸檔