1. 你如何理解 iOS 內存管理
1. new alloc copy retain這些對象我們都要主動的release或者 autorelease
2. 如果是類方法創建的對象,那么系統自動釋放池自動在適當的 時候會幫我們 release
3. ARC xcode 自動會幫我們人工智能的添加 release autorelease 操 作
2. C語言里的數組與OC數組的區別
OC 數組是一個對象,有大量的方法,c 沒有都需要自己寫 C 數組刪除是需要后面往前移動,oc 數組自動處理
3. 淺拷貝與深拷貝的區別 或者什么是深拷貝 什么是淺拷貝 copy, mutableCopy
@interface A {
B *b; }
淺拷貝只是拷貝對象本身,不會對里面的子對象進一步拷貝
?深拷貝會對子對象以及子對象的子對象進一步拷貝
4. 解釋 TCP/IP 協議 HTTP
TCP UDP
IP
TCP/IP 是網絡開發中常見的傳輸協議,他傳輸和 udp 相比是可靠 的。http 是基于 tcp/ip 的主要用戶互聯網的協議
所謂可靠是 tcp 傳輸對方會給一個 ACK 信號(確認信號)
tcp 傳輸不如 udp 快,吞吐量不如 udp 大
tcp 是順序的,udp 是無序的
tcp 會保持連接,udp 不會保持連接
在我們 iOS 開發中用 http 較多。http 協議是一個被動式的
5. 界面之間傳值有哪幾種方法 單例,代理,直接賦值,通知中心/廣播, 數據庫等多種
6. 什么是 MVC 模式
Model, View, Controller, 是 iOS 開發中的典型的設計模式。比如通 過 http 把網絡數據下載并解析然后存于自己的數據模型 Model 中, 然后通知 controller 去刷新界面,通過 controller 講 Model 和 View 進行關聯,這種模式就叫 mvc。
這樣的好處是,可以隔離數據模型 model 和 View 界面。遵循了低 耦合的設計思想.
7. 常見的點擊手勢有哪幾種
UIPinchGuesture, UITapGuesture, UISwipGuesture,
UILongPressGuesture, UIRotationGuesture
8. 瀑布流怎么理解和實現的
1. 如果簡單的來說,用 3 個 tableview 就可以實現瀑布流,3 個 tableview 實現聯動滾動。
2. 其實最好的做法在 scrollview 上使用 3 個復用隊列,如果一種 一個 cell 超過屏幕,不能 release,而是把它回收到復用隊列中, 如果要創建一個 cell,首先從復用隊列中取一個,然后使用。
9. 你如何理解復用機制
一般是對 uiscrollview 做復用機制,因為 uiscrollview 滾動窗口沒 有復用,所以要做,原理就是超過屏幕的 view 不能銷毀,而要放 在復用隊列/池里面存放起來,然后以后要在scrollview顯示view 首先不要 alloc 創建,而要首先去復用池里面找有沒有可復用的 view,如果沒有就 alloc 如果有就直接用。
10. 類別的作用 類別是給已有的類添加方法,但是不能添加變量,匿名類別除外 ()
11. 類別和繼承什么區別
類別/類目/Category 很方便給現有類添加方法。但是不能添加成 員變量,匿名類除外,比如可以給 NSString 增加方法,給 UINavigationBar 增加方法,比如 SDWebImage 給 UIImageView 增 加了 setImageWithURL:方法。類別對于使用者很方便
繼承可以給現有的類增加方法和成員變量。繼承對于使用者來 說不如類別方便 ,比如對 SDWebImage 如果用繼承的話,那么就 需要寫一個類似于 QFImageView 然后把所有的 UIImageView 改成
QFImageView,這里不如類別方便 12. C 和 OC 有哪些基本數據類型
C char, short, int, struct, union, enum
NSString, nsarray, nsdictionary. 13.解釋多線程、NSThread 、NSOperation、GCD
多線程在 iOS 用的很多,比如每個 asi 請求,sdwebimage 請求,數 據請求等待等網絡數據處理,多線程/異步就是主要是為了界面流 暢,防止界面假死。
每一個 ASI 請求就是一個 NSOperation
每一個 NSUrlConnnection 也是一個線程
Nsthread 是創建線程的一個通用的類。比如線程創建,取消,開 始等。
Nsoperation 就是一個簡單的以任務為導向的多線程模型。目的是 為了不懂操作系統,不懂線程的人使用的
GCD 類似于 NSOperation, 是一個 blocks 版本的線程模型。
14. 什么是異步
相對于同步來說,單獨起一個或者多線程去處理 異步是一個概念 線程還是一個技術,異步就是用線程這種技術 實現的
比如界面下載數據,我們啟動一個異步任務 ASI 去網絡下載數據, 然后異步刷新界面,我們無需等待網絡數據下載完成.
15. 代理和協議什么區別
代理是一種概念,協議是一種技術,代理是用協議來實現的,代理 是 2 個對象之間通訊的一種方式。 代理主要做反向傳值的。實現系統的一些回調方法,比如 scrollview 滑動事件,選擇照片,asi 網絡下載完成等。
iOS 開發和 objective-c 區別
16. 代理和通知中心/廣播/NoficationCenter 什么區別
代理主要是反向傳值,一般用來 1:1 的兩個對象通訊上。
通知中心是通過注冊然后接收事件的一種 n:n(多對對) 的方法 17. UITextField、UITextView 的區別
UITextField不能換行,UITextView可以換行。TextView可以點擊
字體放大,可以復制。相同的是他們都有代理類似 18. 怎么解析 HTML 源碼
一般 HTML 是通過 webview 來顯示的。一般簡單的 html 是通過 解析字符串來解析。沒有成熟現成 html 解析器。 一般服務器去抓取html解析html形成json xml文件供手機端讀 取。
19. Objective-C 如何和 javascript 通訊
Objective-c --à?javascript ---à?html 里面內容
Objective-c 是通過 stringByEvaluatingJavaScriptFromString 函數 來執行 html 中的 javascript
Javascript -à?url --à?objective-c 本地方法
需要通過 uiwebview 中的代理函數
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
20. 如何調用 iOS 打電話,發短信
[[UIApplication sharedApplication] openURL:[NSURL urlwithString:@”tel://1543434”]]; [[UIApplication sharedApplication] openURL:[NSURL urlwithString:@”sms://1572234”]]; [[UIApplication sharedApplication] openURL:[NSURL urlwithString:@”mail://hello@hello.com”]];
[[UIApplication sharedApplication] openURL:[NSURL urlwithString:@”http://1000phone.net”]];
21. 下拉刷新需要實現哪幾個方法,刷新流程
下來一般使用 EGORefresh 進行。原理是利用 scrollview 的反彈效 果把刷新 view 加載 scrollview 的負坐標上。通過代理方法去觸發。
22. 解釋 const, static, inline 關鍵字
const 修飾指針,或者常量,比如不可變,
static 修飾變量表示作用域,比如全局的私有變量,函數內部的 static 是內部的私有變量。
Static 修飾函數表示函數是文件作用域
Inline 表示內聯。一般來說 inline 需要和 static 聯合用 一般用法是 static inline int max(int a, int b) {
return a>b?a:b; }
static inline作用是和宏類似,只不過是方便調試(宏不能斷掉調 試,static inline 可以)。運行時候是一樣的。
一般 c/c++短小的函數都用 static inline 內聯函數
23. OC 里怎么實現多繼承
OC 沒有多繼承。用協議實現多繼承,把協議中的方法在實現的類 中重寫 C++有多繼承,多繼承其實用好了很方便。C++多繼承很容易出現 二一性比如:
類 A { int a;}
類B: 類A,類C:類A
類D : B, C那么 int a到底是繼承自誰的 單繼承
24.解釋KVC和KVO
Key value coding, Key value observer.
Kvc 是路徑訪問的規范,kvo 是觀察某個變量的變化過程
KVO 可以觀察某個對象的變量變化過程,KVC 是滿足被觀察的編 碼規范。
KVC/KVO 類似于代理,通知中心。都是一種通訊方法。
25. 什么是單例模式 單例就是在多個對象之間共享數據,類似于全局變量,比如數據 庫打開一次,多個界面都可以使用
26. NSString *name = @”1000phone.com”,[name release]會出現什么 情況
這個代碼不滿足 objective-c 的內存管理黃金法則。沒有 alloc 就
release,
27. 列舉所知道的 iOS 的 API
28. 列舉所知道的 iOS 的類
29. 列舉所知道的 iOS UI 控件
30. 解釋 C++/STL List、map、set、vector list =~ array
map =~ dictionary
set =~ nsset
vector =~ array
31. C/C++和 OC 怎么混用
.m -> .mm
32. POST 請求的鏈接參數怎么拼接
POST 參數有 2 中,一種文件 POST 一種非文件 POST,對于非文 件 POST 格 式 ( form-data/x-www-urlencoded ) 是 name=xxx&id=22&sxx=33
對于文件 POST(multiple/form-data)
33. POST 和 GET 有何區別
GET 和 POST 都是 HTTP 請求方式的 2 中。
POST 是安全的。GET 是不安全的。GET 是放在瀏覽器中地址暴露 出來了。POST 不會。但是在 App 上 GET 和 POST 都看不見。 GET 和 POST 都是和服務器提交參數/通訊的一種方式。
GET 參數不能太長<1024B POST 沒有限制<4G
GET 不能上傳文件, POST 可以上傳文件。 34. 本地存儲方式有哪幾種
數據庫,nsuserdefauts, file , plist,archieve 歸檔 比較小的就放在 nsuserdefaults(以文件設計的存放在 Libraray 中) 數據庫里面適合存放一條一條的記錄
file 一般存普通文件,圖片,視頻,音頻等
plist 存放比 nsuserdefaults 大一些的
歸檔 nsarchieve 可以存對象
35.解釋OC里的id類型
id 是泛型指針,可以指向任何 oc 類型,
id =~ NSObject *
id 是 objc_object 的 typedef,執行 Class 對象
36. retain、copy、readonly、readwrite 的區別
retain對計數器+1 copy是創建一個新對象,readonly只產生getter 函數,readwrite 產生 setter, getter 函數
37. copy 是深拷貝還是淺拷貝
copy 缺省是淺拷貝.但是 copy 也可以做成深拷貝
38. copy 和 mutableCopy 區別
copy 是拷貝,mutableCopy 是可變拷貝,比如把 NSString 通過 mutableCopy 變 成 NSMutableString, 把 NSArray 通 過 mutableCopy 變成 NSMutableArray.
NSString -à?NSMutableString, NSArrayà?NSMutableArray,
NSDictionaryà?NSMutableDictionary, NSData->NSMutableData; 39. 怎么實現對象的本地存儲
歸檔 NSArchieve
40. HTTP 協議、Socket 協議的區別
| 數據協議格式 | 編程 | |
高 | HTTP | | ASI, NSUrlconnection |
中 | TCP 長連接 | UDP | BSD Socket AsyncSocket |
低 | IP | | |
HTTP 啟動一個 NSUrlConnection 在 didFinish 長連接,長期的和服務器保持連接。目的是為了避免每次都要連 接。因為和服務器連接的過程非常復雜。也耗時。所以連接一次。 HTTP 短連接只要處理完就斷掉,下次重新連接 對服務器的負擔 小.
?長連接對服務器壓力很大。
41. 什么是 Push Notification
42. 遍歷數組的三種方式有什么區別
for forin iterator
forin 也叫快速循環。為什么他叫快速循環,原因是速度快?為什
么速度快? 可以通過優化提前把 forin 里面的 array 數組數組全部
導入到 cpu cache 中。因為 cache 訪問速度把內存快至少 100 倍 43. NSArray, NSDictionary 這些是如何做的?
NSArray 使用鏈表做的 NSDictionary 使用 hash 表做出來的 44. C++怎么調用 C 的方法
extern “C” int foo(){ };
45. Blocks 語法有什么優點
Blocks 類似于 c 中回調函數,和代理類似的,類似于 java 中的 listener 匿名函數
46. Frame 和 bounds 有什么區別
Frame 是子視圖相對于父視圖的坐標系統,x y width height, bounds 是 uiview 自己的坐標系統 bounds x y=0
47. 什么叫異步下載,怎么實現圖片的異步下載 48. 什么是緩存
49. ScrollView 的復用機制
滾動過程中把 scrollview 里面的 超出屏幕的 view 放在重用隊列中, 在滾動過程中如果有新的 view 進來,首先從重用隊列中取得 view, 如果沒有就新創建一個。
50. 什么是委托代理模式
委托代理是 2 個對象之間的一種通訊方式。一方使用協議,代理
另外一方實現協議,類似于回調,blocks 等語法。 目的是為了軟件設計的低耦合
51. 什么是通知中心 通知中心是多對多的平等的通訊模式。主要用在多個對象之間松 耦合的通訊模式。對象和對象之間通過通知的名字就可以進行關 聯通訊。
52.解釋關鍵字static、const、inline、 static inline、volatile static 修飾變量表示靜態變量,根據作用域 不同
extern 和 static 是相反的。
Static 修飾函數是表示函數在本文件有效
Static inline 聯合在一起表示內聯函數。類似于宏
Const 修飾變量和變量的內容只讀
Volatile 表示每次都從內存中真正的讀取。主要是用于嵌入式中, 讀取硬件。
53. 如何實現 2 個線程 一個線程+1 一個線程-1
int sum;
NSLock *sumLock; - (void) demo {
sumLock = [[NSLock alloc] init];
[NSThread detachNewThreadSelector:@selector(thread1:) toTarget:self withObject:nil]; [NSThread detachNewThreadSelector:@selector(thread2:) toTarget:self withObject:nil];
}
- (void) thread1:(id)arg {
while (1) { [sumLock lock];
sum++;
[sumLock unlock];
[NSThread sleepForTimeInterval:1]; }
}
- (void) thread2:(id)arg {
while (1) { [sumLock lock];
sum--;
[sumLock unlock];
[NSThread sleepForTimeInterval:0.5];
} }
54. OC 中有私有方法嗎?怎么實現
在.m 文件中實現 Category,只是在.m 中方法
55. OC 中有私有成員變量嗎?怎么實現 在.m 文件中實現匿名類別 Category
56. 成員變量的作用域有哪幾種 @public, @protected, @private
57. 數據庫能不能存圖片,怎么存?
可以存圖片, nsdata 存,但是我們一般不這樣存,我們存路徑把 圖片存在沙盒中。
58. 線程之間怎么通信?
59. 線程生產者,消費者如何實現?
1 個線程是生產者,一個是消費者如何實現這個模型.
NSMutableArray *dataList; NSLock *dataLock;
- (void) produceAndConsume {
dataList = [[NSMutableArray alloc] init];
dataLock = [[NSLock alloc] init];
[NSThread detachNewThreadSelector:@selector(produce:) toTarget:self withObject:nil]; [NSThread detachNewThreadSelector:@selector(consume:) toTarget:self withObject:nil];
}
- (void) produce:(id)arg {
int index = 0; while (1) {
NSNumber *n = [NSNumber numberWithInt:index++]; [dataLock lock];
[dataList addObject:n];
[NSThread sleepForTimeInterval:0.5];
} }
- (void) consume:(id)arg { while (1) {
if ([dataList count] > 0) { [dataLock lock];
id obj = [dataList objectAtIndex:0]; [dataList removeObject:0]; [dataLock unlock];
NSLog(@"消費 obj %@", obj);
}
[NSThread sleepForTimeInterval:1]; }
}
60. 不同屏幕怎么適配
iphone, iphone3G, iphone3GS 320x480
iphone4, iphoen4S 640x960 retina
iphone5, iphone5S, 640x1136
寫程序需要有 2 套圖片 demo.png demo@2x.png iphone5 適配.
1136/2-44-49
[[UIScreen mainScreen] applicationFrame] = (320x460, 320x548) [[UIScreen mainScreen] bounds] = (320x480, 320x568)
iPad, iPad2, iPad Mini 1024x768
iPad3, iPad4, 2048x1563
61. 不同版本屏幕旋轉怎么適配 62. 內存警告應該怎么做
盡量多的釋放內存。把一些內容寫到文件中,不要保存在內存中。 63. iOS5, iOS6, iOS7 區別
64. NSNotification 是同步還是異步的
是同步的. 如果需要異步 必須使用 NSNotificationQueue 實現
A notification center delivers notifications to observers synchronously. In other words, the postNotification: methods do not return until all observers have received and processed the notification. To send notifications asynchronously use NSNotificationQueue.
In a multithreaded application, notifications are always delivered in the thread in which the notification was posted, which may not be the same thread in which an observer registered itself.
Hope it helps you.