iOS基础知识(面试必备)
iOS開發的設計模式
一、代理模式
應用場景:當一個類的某些功能需要由別的類來實現,但是又不確定具體會是哪個類實現。
優勢:解耦合
敏捷原則:開放-封閉原則
實例:tableview的 數據源delegate,通過和protocol的配合,完成委托訴求:列表row個數delegate,自定義的delegate。
二、觀察者模式
應用場景:一般為model層對,controller和view進行的通知方式,不關心誰去接收,只負責發布信息。
優勢:解耦合
敏捷原則:接口隔離原則,開放-封閉原則
實例:Notification通知中心,注冊通知中心,任何位置可以發送消息,注冊觀察者的對象可以接收;KVO,鍵值對改變通知的觀察者。
三、MVC模式
應用場景:是一中非常古老的設計模式,通過數據模型,控制器邏輯,視圖展示將應用程序進行邏輯劃分。
優勢:使系統,層次清晰,職責分明,易于維護
敏捷原則:對擴展開放-對修改封閉
實例:model-即數據模型,view-視圖展示,controller進行UI展現和數據交互的邏輯控制。
四、單例模式
應用場景:確保程序運行期某個類,只有一份實例,用于進行資源共享控制。
優勢:使用簡單,延時求值,易于跨模塊
敏捷原則:單一職責原則
實例:[UIApplication sharedApplication]。
注意事項:確保使用者只能通過 getInstance方法才能獲得,單例類的唯一實例。object c中,重寫allocWithZone方法,保證即使用戶用 alloc方法直接創建單例類的實例,返回的也只是此單例類的唯一靜態變量。
五、策略模式
應用場景:定義算法族,封裝起來,使他們之間可以相互替換。
優勢:使算法的變化獨立于使用算法的用戶
敏捷原則:接口隔離原則;多用組合,少用繼承;針對接口編程,而非實現。
實例:排序算法,NSArray的sortedArrayUsingSelector;經典的鴨子會叫,會飛案例。
注意事項:
1,剝離類中易于變化的行為,通過組合的方式嵌入抽象基類;
2,變化的行為抽象基類為,所有可變變化的父類;
3,用戶類的最終實例,通過注入行為實例的方式,設定易變行為
防止了繼承行為方式,導致無關行為污染子類,完成了策略封裝和可替換性。
六、工廠模式
應用場景:工廠方式創建類的實例,多與proxy模式配合,創建可替換代理類。
優勢:易于替換,面向抽象編程,application只與抽象工廠和易變類的共性抽象類發生調用關系。
敏捷原則:DIP依賴倒置原則
實例:項目部署環境中依賴多個不同類型的數據庫時,需要使用工廠配合proxy完成易用性替換。
注意事項:項目初期,軟件結構和需求都沒有穩定下來時,不建議使用此模式,因為其劣勢也很明顯,增加了代碼的復雜度,增加了調用層次,增加了內存負擔,所以要注意防止模式的濫用。
delegate與block的區別
delegate:
1、“一對一”,對同一個協議,一個對象只能設置一個代理delegate,所以單例對象就不能用代理;
2、代理更注重過程信息的傳輸:比如發起一個網絡請求,可能想要知道此時請求是否已經開始、是否收到了數據、數據是否已經接受完成、數據接收失敗。
3、公共接口,方法較多選擇用delegate進行解耦:iOS有很多例子比如最常用tableViewDelegate,textViewDelegate;
block:
1、寫法更簡練,不需要寫protocol、函數等;
2、block注重結果的傳輸:比如對于一個事件,只想知道成功或者失敗,并不需要知道進行了多少或者額外的一些信息;
3、異步和簡單的回調用block更好:iOS有很多例子比如常用的網絡庫AFNetwork,ASIHTTP庫,UIAlertView類。
4、block需要注意防止循環引用:
ARC:
非ARC:
__block typeof(self) weakSelf = self;[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {[weakSelf doSomething];}];補充:
__block和__weak修飾符的區別:
1.__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數據類型。
2.__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。
3.__block對象可以在block中被重新賦值,__weak不可以。
常用的三方庫
1、jsonjson編碼解碼
2、GTMBase64 base64編碼解碼
3、TouchXML 解析
4、SFHFKeychainUtils 安全保存用戶密碼到keychain中
5、MBProgressHUD很棒的一個加載等待特效框架
6、ASIHTTPRequest 等相關協議封裝
7、EGORefreshTableHeaderView 下拉刷新代碼
8、AsyncImageView 異步加載圖片并緩存代碼
9、類似setting的豎立也分欄程序
10、MBProgressHUD——進展指示符庫
11、Flurry——詳盡的使用統計
12、CorePlot——2D圖形繪圖儀
13、GData client——iPhone上所有Google相關服務的類庫
14、SDWebImage——簡化網絡圖片處理
15、RegexKitLite——正則表達式支持
網絡請求GET與POST的區別
1、GET請求:將參數直接寫在訪問路徑上,操作簡單, 不過容易讓外界看到, 安全性不高, 地址最多 255 字節;POST 請求: 將參數放到 body 里面, POST請求的操作相對復雜, 需要將參數和地址分開, 不過安全性高,參數放在body里面, 不容易被捕獲。
2、一個URL地址,它用于描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查 ,改 ,增 ,刪 4個操作。因此GET一般用于獲取、查詢資源信息,而POST一般用于更新資源信息。
3、GET使用URL或Cookie傳參,而POST將數據放在BODY中。
4、GET的URL會有長度上的限制,則POST的數據則可以非常大。
5、POST比GET安全,因為數據在地址欄上不可見。
GCD隊列dispatch_queue_t的生成方式
//生成一個串行隊列,隊列中的block按照先進先出(FIFO)的順序去執行,實際上為單線程執行。第一個參數是隊列的名稱,在調試程序時會非常有用,所有盡量不要重名了。 dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL); //生成一個并發執行隊列,block被分發到多個線程去執行 dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT); //獲得程序進程缺省產生的并發隊列,可設定優先級來選擇高、中、低三個優先級隊列。由于是系統默認生成的,所以無法調用dispatch_resume()和dispatch_suspend()來控制執行繼續或中斷。 //需要注意的是,三個隊列不代表三個線程,可能會有更多的線程。并發隊列可以根據實際情況來自動產生合理的線程數,也可理解為dispatch隊列實現了一個線程池的管理,對于程序邏輯是透明的。 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //官網文檔解釋說共有三個并發隊列,但實際還有一個更低優先級的隊列,設置優先級為DISPATCH_QUEUE_PRIORITY_BACKGROUND。Xcode調試時可以觀察到正在使用的各個dispatch隊列。 dispatch_queue_t queue = dispatch_get_main_queue(); //獲得主線程的dispatch隊列,實際是一個串行隊列。同樣無法控制主線程dispatch隊列的執行繼續或中斷。線程和進程的聯系與區別
1、進程和線程都是由操作系統所體現的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發性(并發是指兩個或多個任務在同一時間間隔內發生,但是在任意一個時間點CPU只會處理一個任務),進程是線程的容器,真正完成代碼執行的過程,而進程則作為線程的執行環境。
2、兩者的主要區別在于它們是不同的操作系統資源管理方式。進程有2立的地址空間,一個進程崩潰后,在保護模式的影響下不會對其他進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等同于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。
Block發生循環引用和解決方案
發生情況:定義 block 的時候,會對外部變量做一次copy,而將block屬性設為了strong, 完成回調時強引用self。
解決辦法:
// 在ARC下,由于__block抓取的變量一樣會被Block retain,所以必須用弱引用才可以解決循環引用問題,iOS 5之后可以直接使用__weak,之前則只能使用__unsafe_unretained了,__unsafe_unretained缺點是指針釋放后自己不會置空。__weak typeof(self) weakSelf = self;self.myBlock = ^(int paramInt) {//使用weakSelf訪問self成員[weakSelf doSomething];};//在非ARC下,顯然無法使用弱引用,這里就可以直接使用__block來修飾變量,它不會被Block所retain的。__block typeof(self) weakSelf = self;self.myBlock = ^(int paramInt) {//使用weakSelf訪問self成員[weakSelf doSomething];};用CATextLayer實現一個UILabel
CATextLayer *textLayer = [CATextLayer layer];textLayer.frame = CGRectMake(100,100,100,100);[self.view.layer addSublayer:textLayer];textLayer.foregroundColor = [UIColor blackColor].CGColor;textLayer.alignmentMode = kCAAlignmentJustified;textLayer.wrapped =YES;UIFont *font = [UIFontsystemFontOfSize:15];CFStringRef fontName = (__bridgeCFStringRef)font.fontName;CGFontRef fontRef = CGFontCreateWithFontName(fontName);textLayer.font = fontRef;textLayer.fontSize = font.pointSize;CGFontRelease(fontRef);NSString *text = @"Cupid laid by his brand, and fell asleep";textLayer.string = text;textLayer.contentsScale = [UIScreen mainScreen].scale; // 在Retina顯示參考文章:http://www.jianshu.com/p/7429bb12e10c
Cocoa Touch的框架
Address Book UI 框架:Objective-C的編程接口,可以顯示創建或者編輯聯系人的標準系統界面。簡化了應用程序顯示聯系人信息所需的工作,也可以確保應用程序使用的界面和其他應用程序相同,進而保證跨平臺一致性。
Game Kit 框架:該框架支持點對點連接及游戲內語音功能,您可以通過該框架為應用程序增加點對點網絡功能。
Event Kit UI 框架:提供一個視圖控制鍵可以展現查看并編輯事件的標準系統界面。
iAd 框架:通過該框架在應用程序中發布橫幅廣告,廣告會被放入到標準視圖,您可以將這些視圖加入到用戶界面,并在合適的時機向用戶展現。這些視圖和蘋果的公告服務相互協作,自動處理廣告內容的加載和展現,同時也可以響應用戶對廣告的點擊。
Map Kit 框架:iOS 3.0導入了 Map Kit框架 (MapKit.framework) ,該框架供一個可被嵌入到應用程序的地圖界面,該界面包含一個可以滾動的地圖視圖。可以在視圖中添加定制信息,并可將其嵌入到應用程序視圖,通過編程的方式設置地圖的各種屬性(包括當前地圖顯示的區域以及用戶的方位)。也可以使用定制標注或標準標注(例如使用測針標記)突出顯示地圖中的某些區域或額外的信息。在iOS 4.0系統中,該框架開始支持可拖動標注以及定制覆蓋層。可拖動標注允許您通過編程方式或通過用戶交互方式重定位某個標注的位置。覆蓋層可用于創建多個點組成的復雜地圖標注。地圖表面諸如公交路線、選舉地圖、公園邊界或者氣象信息(例如雷達數據)等可以使用覆蓋層進行顯示。
Message UI 框架:您可以利用該框架撰寫電子郵件,并將其放入到用戶的發件箱排隊等候發送。該框架提供一個視圖控制器界面,您可以在應用程序中展現該界面,讓用戶通過該界面撰寫郵件。界面的字段可以根據待發送信息的內容生成。例如您可以設置接收人、主題、郵件內容并可以在郵件中包含附件。這個界面允許用戶先對郵件進行編輯,然后再選擇接受。在用戶接受郵件內容后,相應的郵件就會放入用戶的發件箱排隊等候發送。
UIKit 框架:UIKit框架 (UIKit.framework)的Objective-C編程接口為實現iOS應用程序的圖形及事件驅動提供關鍵基礎。iOS系統所有程序都需要通過該框架實現下述核心功能:應用程序管理,用戶界面管理,圖形和窗口支持,多任務支持,處理觸摸及移動事件,代表標準系統視圖和控件的對象,文本和web內容相關操作,剪切、復制以及粘貼,使用動畫顯示用戶界面內容,通過URL方式將其他應用程序整合到系統,蘋果推送通知服務支持,為殘疾用戶供輔助功能,本地通知的調度和發送,創建PDF,使用定制輸入視圖(其行為類似系統鍵盤),創建和系統鍵盤進行交互的定制文本視圖。當然還有加速器數據,內置相機(存在相機的設備),用戶的圖片庫,設備名稱和模型信息,電池狀態信息,距離感應器信息,
來自綁定聽筒的遠程控制信息。媒體層:
1、Core Graphics (也被稱為Quartz),用于處理本地2D向量渲染和圖片渲染。
2、Core Animation ( Quartz Core框架的一部分),為動畫視圖和其他內容提供更高級別支持。
3、OpenGL ES,為使用硬件加速接口的2D和3D渲染提供支持。
4、Core Text,提供一個精密的文本布局和渲染引擎。
5、Image I/O,提供讀取及編寫大多數圖形格式的接口。
6、資產庫框架(Assets Library framework),可用于訪問用戶照片庫中的照片和視頻。音頻技術:
1、媒體播放器框架。該框架可以讓訪問用戶的iTume庫變得很容易,并且支持播放曲目和播放列表。
2、AV Foundation框架。它提供一組簡單易用的Objective-C接口,可用于管理音頻的播放或錄制。.
3、OpenAL框架。它提供一組跨平臺,用于發布方位音頻的接口。
4、Core Audio框架。它提供的接口簡單而精密,可用于播放或錄制音頻內容。您可以使用這些接口播放系統的警報聲音、觸發備的震動功能、管理多聲道的緩沖和播放、對音頻內容進行流化處理。視頻技術:
1、媒體播放器框架,它提供一組易于使用的接口,可用于播放應用程序中全屏或部分屏的電影。
2、AV Foundation框架,它提供一組Objective-C接口,可以對電影的捕捉和播放進行管理。
3、Core Media框架,它對較高級框架使用的底層類型進行描述,同時也提供一些底層接口,它們用于對媒體進行處理。
#import與@class的區別
“#import”會將此類的所有文件全部導入,而@class只是告訴編譯器有這么一個類,引用類名,一般用在.h文件@interface之前;簡而言之,就是當只需要定義此類時,只需要@class類名即可,而需要用到此類的方法或變量時,就需要用#import來包含整個類的文件;
如果只需要@class ,而用了#import是不會報錯的,但是會大大影響程序的效率,因為這樣在編譯過程中必須將import的所有類都編譯一遍,尤其是引用的類比較多時;比如你在A類中import了B類,而B類中又import了c、d類,那程序在編譯時要將A,B,c,d類全部編譯一遍,而用@class則不會耗費大量時間。
如果有循環依賴關系,如:A–>B, B–>A這樣的相互依賴關系,如果使用#import來相互包含,那么就會出現編譯錯誤,如果使用@class在兩個類的頭文件中相互聲明,則不會有編譯錯誤出現。
如何解決滑動TableView時卡頓的問題
tableView 滑動卡的問題主要是因為:從緩存中或者是從本地讀取圖片給UIImage的時候耗費的時間比較長。需要在子線程中添加:
NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]]; //得到圖像數據 UIImage *image = [UIImage imageWithData:imgData];然后在主線程中將image的值賦值給相應的imageView.image;
當然,這是主要的問題解決,如果想更好地解決,還有最好使用不透明視圖以及不要重復創建不必要的table cell等優化的地方。
UIView的父類與子類
UIButton的父類是UIControl
UIControl的父類是UIView
UIView的父類是 UIResponder
Objective-C中的self和super
當使用self調用方法時,會從當前類的方法列表中開始找,如果沒有,就從父類中再找;當使用super時,則從父類的方法列表中開始找,然后調用這個方法。
Objective-C中的copy與retain區別
copy是內容拷貝,對象指向不同的地址,而retain是指針拷貝,指向相同的地址,計數加1。
Objective-C中的assign與retain的區別
assign是直接賦值,如果兩個對象共享一內存地址,不能直接釋放這塊內存地址,否則會引起崩潰現象;當數據為int、 float等原生類型時,使用assign則不會;
使用retain則可以給上面的內存地址分配引用計數,retain引起引用計數加1,release引起引用計數減1,當引用計數為0時,dealloc函數被調用,內存被回收。
Objective-C中的weak與strong的區別
1、在對象屬性上使用weak 和strong時,strong就相當于retain屬性,讓引用計數+1,而weak相當于assign則不會。
2、只有一種情況需要使用weak(默認是strong),就是為了避免retain cycles(就是父類中含有子類{父類retain了子類},子類中又調用了父類{子類又retain了父類},這樣都無法release)
3、聲明為weak的指針,指針指向的地址一旦被釋放,這些指針都將被賦值為nil,這樣的好處能有效的防止野指針。
寫一個NSString類的實現
+ (id)initWithCString:(const char*)nullTerminatedCString encoding:(NSStringEncoding)encoding;+ (id) stringWithCString: (constchar*)nullTerminatedCString encoding: (NSStringEncoding)encoding { NSString *obj; obj = [self allocWithZone:NSDefaultMallocZone()]; obj = [obj initWithCString:nullTerminatedCString encoding: encoding]; return AUTORELEASE(obj); }Objective-C語言的優缺點
Objective-C優點:
1) Cateogies
2) Posing
3) 動態識別
4) 指標計算
5) 彈性訊息傳遞
6) 不是一個過度復雜的 C 衍生語言
7) Objective-C 與 C++ 可混合編程
Objective-C缺點:
1) 不支援命名空間
2) 不支持運算符重載
3) 不支持多重繼承
4) 使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到(如內聯函數等),性能低劣。
總結
以上是生活随笔為你收集整理的iOS基础知识(面试必备)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS开发之实现毛玻璃效果及图片模糊效果
- 下一篇: iOS之身份证号码全校验与校验位自动补全