參考答案不惟一,你們能夠根據本身的理解回答,沒有必要跟筆者的同樣。參考筆者的答案,也許給你帶來靈感!html
例如:ios
1
2
3
|
NSArray *array = @[@"12-11", @"12-11", @"12-11", @"12-12", @"12-13", @"12-14"];
|
參考答案:web
1
2
3
4
5
6
7
8
9
10
11
12
|
NSMutableArray *resultArray = [[NSMutableArray alloc] initWithCapacity:array.count];
// 外層一個循環
for (NSString *item in array) {
// 調用-containsObject:本質也是要循環去判斷,所以本質上是雙層遍歷
// 時間複雜度爲O ( n^2 )而不是O (n)
if (![resultArray containsObject:item]) {
[resultArray addObject:item];
}
}
NSLog(@"resultArray: %@", resultArray);
|
補充:原來集合操做能夠經過valueForKeyPath來實現的,去重能夠一行代碼實現:面試
1
2
3
4
|
array = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];
NSLog(@"%@", array);
|
可是返回的結果是無序的,與原來的順序不一樣。你們能夠閱讀:Collection Operators算法
1
2
3
4
5
6
7
8
|
NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] initWithCapacity:array.count];
for (NSString *item in array) {
[resultDict setObject:item forKey:item];
}
NSArray *resultArray = resultDict.allValues;
NSLog(@"%@", resultArray);
|
若是須要按照原來的升序排序,能夠這樣:數據庫
1
2
3
4
5
6
7
8
|
resultArray = [resultArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
NSString *item1 = obj1;
NSString *item2 = obj2;
return [item1 compare:item2 options:NSLiteralSearch];
}];
NSLog(@"%@", resultArray);
|
1
2
3
4
5
|
NSSet *set = [NSSet setWithArray:array];
NSArray *resultArray = [set allObjects];
NSLog(@"%@", resultArray);
|
若是要求有序,那就得排序,好比這裏要升序排序:swift
1
2
3
4
5
6
7
8
|
resultArray = [resultArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
NSString *item1 = obj1;
NSString *item2 = obj2;
return [item1 compare:item2 options:NSLiteralSearch];
}];
NSLog(@"%@", resultArray);
|
補充:數組
一直沒有使用過有序集合,網友們反饋到能夠直接使用有序集合,感謝你們:緩存
1
2
3
4
|
NSOrderedSet *set = [NSOrderedSet orderedSetWithArray:array];
NSLog(@"%@", set.array);
|
以上三種方法是筆者所能想到的辦法。若是你們有更好的辦法,歡迎在評論中指出。服務器
1
2
3
|
NSArray、NSSet、NSDictionary與NSMutableArray、NSMutableSet、NSMutableDictionary
|
參考答案:
特性:
做用:
參考答案:
筆者傾向於純代碼開發,因此所提供的參考答案可能具備必定的我的感情,不過仍是給你們說說筆者的想法。
優勢:
缺點:
2015-04-10格式化日期轉爲NSDate類型
參考答案:
1
2
3
4
5
6
7
8
9
|
NSString *timeStr = @"2015-04-10";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
formatter.timeZone = [NSTimeZone defaultTimeZone];
NSDate *date = [formatter dateFromString:timeStr];
// 2015-04-09 16:00:00 +0000
NSLog(@"%@", date);
|
參考答案:
在iOS中,一般是一般UIWebView來實現,固然在iOS8之後可使用WKWebView來實現.有如下幾種實現方法:
1
2
3
|
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
|
優缺點:
參考答案:
首先,咱們要明確一點,同步和異步都是在線程中使用的。在iOS開發中,好比網絡請求數據時,若使用同步請求,則只有請求成功或者請求失敗獲得響應返回後,才能繼續往下走,也就是才能訪問其它資源(會阻塞了線程)。網絡請求數據異步請求時,不會阻塞線程,在調用請求後,能夠繼續往下執行,而不用等請求有結果才能繼續。
區別:
參考答案:
在iOS中隊列分爲如下幾種:
1
2
3
|
dispatch_queue_t q = dispatch_queue_create("...", DISPATCH_QUEUE_SERIAL);
|
1
2
3
|
dispatch_queue_t q = dispatch_queue_create("......", DISPATCH_QUEUE_CONCURRENT);
|
1
2
3
|
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
|
1
2
3
|
dispatch_queue_t q = dispatch_get_main_queue();
|
上面這四種是針對GCD來說的,串行隊列中的任務只能一個個地執行,在前一個沒有執行完畢以前,下一個只能等待。並行隊列能夠併發地執行任務,所以多個任務之間執行的順序不能肯定,當添加一個新的任務時,交由GCD來判斷是否要建立新的新的線程。
你們能夠閱讀圖片多線程,也許更明瞭:
參考答案:
內存管理準則:誰強引用過,誰就在再也不使用時使引用計數減一。
對於內存的使用和優化常見的有如下方面:
參考答案:
plist是iOS系統中特有的文件格式。咱們經常使用的NSUserDefaults偏好設置實質上就是plist文件操做。plist文件是用來持久化存儲數據的。
咱們一般使用它來存儲偏好設置,以及那些少許的、數組結構比較複雜的不適合存儲 數據庫的數據。好比,咱們要存儲全國城市名稱和id,那麼咱們要優先選擇plist直接持久化存儲,由於更簡單。參考答案:
詳情請閱讀:iOS經常使用的持久化存儲方式
參考答案:
數據庫的簡單操做,仍是會的,大學可沒白學。
增:
1
2
3
|
insert into tb_blogs(name, url) values('標哥的技術博客','http://www.henishuo.com');
|
刪:
1
2
3
|
delete from tb_blogs where blogid = 1;
|
改:
1
2
3
|
update tb_blogs set url = 'www.henishuo.com' where blogid = 1;
|
查:
1
2
3
|
select name, url from tb_blogs where blogid = 1;
|
十二、在提交蘋果審覈時,遇到哪些問題被拒絕,對於被拒絕的問題是如何處理的。
參考答案:
對於筆者而言,所提交過的app尚未被拒絕過。不過在筆者所維護的幾個羣裏常常有朋友們問到相關被拒絕的解決辦法。幸虧還懂一點點英文,還能幫助他們翻譯翻譯蘋果反饋的被拒緣由及所擔的建議。
這裏只列出幾種最多見的被拒緣由:
在這個夜晚,全部答案都是筆者花了大量的時間來整理出來的,且看且珍惜吧!