iOS面試題

1.描述什么是MVC

【MVC簡介】

是一種架構(gòu)模式,它是蘋果非常熱衷的一種架構(gòu)模式

M:model模型保存所有應用程序里要使用的數(shù)據(jù),比如一款太空大戰(zhàn)游戲,模型要負責保存飛船的大小、飛行速度、位置信息、裝載了多少只槍等等這些信息。并且要處理數(shù)據(jù)之間的邏輯比如飛船要打中敵機多少次能把敵機擊落

模型只是負責記錄數(shù)據(jù),跟數(shù)據(jù)的顯示是沒關(guān)系的,數(shù)據(jù)的顯示是控制器跟視圖的任務

C:controller控制器負責控制視圖如何去顯示模型里要顯示的數(shù)據(jù)它要負責把模型里的數(shù)據(jù)傳輸給視圖(控制器是通過視圖控制器的【生命周期】來控制視圖變化的)

V:view視圖視圖就是視圖控制器的小跟班,它的任務就是負責顯示視圖,完全聽命于視圖控制器,視圖控制器讓視圖做什么視圖就做什么

2.列舉常用網(wǎng)絡協(xié)議的端口號,例如HTTP默認的是80

FTP文本傳輸協(xié)議20或21

TELNET遠程登錄協(xié)議23

POP3發(fā)郵件協(xié)議110

3、frame與bounds的區(qū)別?Bounds的大小改變frame改變嗎

答:frame指的是:該view在父view坐標系統(tǒng)中的位置和大小。(參照點是父親的坐標系統(tǒng))

bounds指的是:該view在本身坐標系統(tǒng)中的位置和大小。(參照點是本身坐標系統(tǒng))

會發(fā)生改變

4、UIViewController的生命周期方法調(diào)用順序

答:-

(void)viewDidLoad;

- (void)viewDidUnload;

- (void)viewWillAppear:(BOOL)animated;

- (void)viewDidAppear:(BOOL)animated;

- (void)viewWillDisappear:(BOOL)animated;

- (void)viewDidDisappear:(BOOL)animated;

5、UITableView的執(zhí)行流程是怎么樣的

答:"numberOfSectionsInTableView:"返回TableView的section數(shù)目

"tableView:titleForHeaderInSection:"section1是否有表頭標題欄

"tableView:numberOfRowsInSection:"設置section1中行數(shù)

"tableView:heightForRowAtIndexPath:"設置section1中row1行的高度……row2行的高度……逐行設置,直至當前section1屬性設置完畢

"tableView:titleForHeaderInSection:"section2是否有表頭欄,之后同4-5,設置section2的屬性.同理,設置完畢所有的section的相關(guān)屬性

"tableView:cellForRowAtIndexPath:"接下來設置的是每個section中每row添加的數(shù)據(jù)

這樣整個TableView就設置完畢了.

6、如何設計一個可變高度(根據(jù)內(nèi)容自適應高度)的UITableViewCell

答:1)創(chuàng)建并添加一個UILabel作為單元格cell的子視圖;

2)在UITableView的委托方法:

(CGFloat)tableView:(UITableView*)tableViewheightForRowAtIndexPath: (NSIndexPath

*) indexPath中計算高度

3)在UITableView的委托方法:

(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:

(NSIndexPath *) indexPath中計算UILabel的框大小。

7、UIView的圓角屬性設置方法

答:利用setCornerRadius:

8.UIVIiewController在現(xiàn)實過程中,各個方法的調(diào)用順序

init->viewDidLoad->viewDidAppear->viewDidUnload

9.對于語句NSString *obj = [[NSData

alloc]init],obj在編譯時和運行時分別是什么類型的對象?

答:編譯時為NSString類型,運行時為NSData類型。

10.object-c中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時執(zhí)行代碼,方法又是什么?

答:a、線程創(chuàng)建有三種方法:使用NSThread創(chuàng)建(detachNewThreadSelector:toTarget:withObject:)、使用GCD的dispatch、使用子類化的NSOperation,然后將其加入NSOperationQueue;

b、在主線程執(zhí)行代碼,方法是performSelectorOnMainThread,

c、如果想延時執(zhí)行代碼可以用performSelector:withObject:afterDelay:

11.描述一下iOS SDKSDK中如何實現(xiàn)MVC的開發(fā)模式?

答:iOS開發(fā)中使用了很好的分層設計,數(shù)據(jù)都可以放在自定義類型、NSArray及其子類型、NSDictionary及其子類型中,視圖的顯示都用UIView及其子類來實現(xiàn),控制器在UIViewController的子類中實現(xiàn),在控制器的ViewDidLoad、ViewWillAppear、ViewDidAppear、ViewDidDisappear、ViewWillDisappear等方法中實現(xiàn)數(shù)據(jù)和視圖的交互。

12、MVC設計模式是如何體現(xiàn)在iOS

Appkai'fa開發(fā)中的?三者之間有哪些常見消息傳遞方式?

答:iOS開發(fā)中使用了很好的分層設計,數(shù)據(jù)都可以放在自定義類型、NSArray及其子類型、NSDictionary及其子類型中,視圖的顯示都用UIView及其子類來實現(xiàn),控制器在UIViewController的子類中實現(xiàn),在控制器的ViewDidLoad、ViewWillAppear、ViewDidAppear、ViewDidDisappear、ViewWillDisappear等方法中實現(xiàn)數(shù)據(jù)和視圖的交互。三者之間常見消息傳遞方式有:代理、通知中心、kvc/kvo等。

13.關(guān)于自定義Cell中,圖片下載用到的方法?

如果有添加了第三方庫SDWebImage/AFNetWorking,可以使用UIImageView的類別方法setImageWithURL:直接異步加載,如果沒有的話可以使用NSURLConnection發(fā)起request請求,或者使用ASI將下載請求添加到下載隊列中,將圖片下載之后,在回調(diào)方法里,回調(diào)主線程,設置圖片。

14.UITableViewCell怎樣使用更流暢?

首先cell的復用機制節(jié)約了系統(tǒng)資源;其次應當注意有些復雜的大數(shù)據(jù)或網(wǎng)絡數(shù)據(jù)應采用異步加載的方式進行加載,以免cell刷出時發(fā)生卡頓。

15.在UIWebView上點擊回復,如何使用UITextField進行回復?

UIWebView有一個stringByEvaluatingJavaScriptFromString方法可以將javascript嵌入頁面中,通過這個方法我們可以在iOS中與UIWebView中的網(wǎng)頁元素交互。通過JAVAScript獲取點擊時間,彈出UITextField,輸入字符串后,可以通過post請求發(fā)送回復。

16.關(guān)于圖文混排是如何排版的?

圖文混排應當以圖片為起點,首先明確圖片的位置,文字可以選擇位于圖片的下方,或者是環(huán)繞效果。環(huán)繞效果可以采用2個以上label或textView來實現(xiàn);也可以通過AttributeString的屬性設置,或者CoreText重繪UIVIew,添加文字的方式,修改文字間的間隔,達到讓出圖片的效果。如果圖文顯示在高度可變的視圖中,如tableView的Cell中,可以計算文字占位Rect,動態(tài)修改視圖或cell的高度。

17.@property (nonatomic, retain)

IBOutlet UIView * view這個對象需要release嗎,如果需要,如何做?

其實XIB文件所生成的視圖對象是無法真正釋放的,因此關(guān)聯(lián)XIB的屬性也可以設置為assign屬性,而視圖不會釋放。從這個角度上講,這個對象不釋放也可以,但是既然用retain做修飾符,出于尊重內(nèi)存管理法則,理應進行釋放,最簡單的方式就是將視圖在dealloc方法中設為nil,適用于非ARC,但ARC中這樣寫也沒關(guān)系。

18.兩種傳輸協(xié)議在什么時候使用?

所謂的兩種傳輸協(xié)議,是指網(wǎng)絡協(xié)議中的傳輸層協(xié)議,即TCP協(xié)議和UDP協(xié)議。TCP協(xié)議會在收發(fā)數(shù)據(jù)的兩端建立穩(wěn)定可靠,有序的鏈接,傳輸數(shù)據(jù)穩(wěn)定可靠,但系統(tǒng)資源消耗較大,適合,數(shù)據(jù)或文件的下載或上傳,Http網(wǎng)絡協(xié)議就是采用TCP傳輸協(xié)議傳輸數(shù)據(jù)的。UDP是通俗講得漂流瓶協(xié)議,發(fā)出協(xié)議的主機就像扔出漂流瓶的魯濱遜一樣,不再負責數(shù)據(jù)的跟蹤和校驗,優(yōu)點是系統(tǒng)資源占用低,缺陷是沒有在收發(fā)兩端建立穩(wěn)定的傳輸路線,數(shù)據(jù)有丟包,損壞或后發(fā)先至等缺陷,優(yōu)秀的UDP傳輸服務器,會反復發(fā)送校驗序列,以保證數(shù)據(jù)的正確。

19.push推送機制

iOS在系統(tǒng)級別有一個推送服務程序使用5223端口。使用這個端口的協(xié)議源于Jabber后來發(fā)展為XMPP,被用于Gtalk等IM軟件中。所以,iOS的推送,可以不嚴謹?shù)睦斫鉃椋?/p>

蘋果服務器朝手機后臺掛的一個IM服務程序發(fā)送的消息。

然后,系統(tǒng)根據(jù)該IM消息識別告訴哪個Apps具體發(fā)生了什么事。

然后,系統(tǒng)分別通知這些Apps。

20.iOS播放音頻的幾種方法?

iPhone OS主要提供以下了幾種播放音頻的方法:

System Sound Services

AVAudioPlayer類

Audio Queue Services

OpenAL

21.代理的作用

代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針??梢詼p少框架復雜度。

另外一點,代理可以理解為java中的回調(diào)監(jiān)聽機制的一種類似。

22.intretVal=UIApplication(argc,argv,nil,nil):是什么意思

對UIApplication對象進行了初始化,這個方法除了argc和argv參數(shù)外,另外這個函數(shù)還有2個兩個字符串參數(shù)來識別UIApplication類和UIApplication代理類,在這里默認是2個nil,第一個參數(shù)為nil就默認把UIApplication類作為缺省值進行初始化,可以在這里不填nil而是使用自己定義的UIApplication子類。至于第二個參數(shù)nil就設置為nil就把模板生成的HelloWorldAppdelegate類作為默認值。

23.保存一個變量到本地,列舉兩個簡單的方法

1,用NSUserDefaults存儲小量數(shù)據(jù)

2,直接writeTofF ile

3,存數(shù)據(jù)庫

4,歸檔

24.如果UIView *

view已經(jīng)實例化,在view僅添加了n個UIButton類的實例,這些button不是全局的,并且button已經(jīng)用tag區(qū)分開,如何快速找出指定的一個button改變他的屬性?

button=(UIButton*)[view viewWithTag:tag]

25.當A類 中的某個方法執(zhí)行到某處時,這時想在B類中執(zhí)行某個方法,如何做?并做簡單說明

用代理執(zhí)行代理方法

說明:在b類中實現(xiàn)協(xié)議方法,設置a的代理為b,在指定方法內(nèi)調(diào)用代理的協(xié)議方法

26.oc中加號方法與減號方法的區(qū)別

加號方法是類方法,用類名直接調(diào)用

減號方法為實例方法,需要創(chuàng)建一個實例對象調(diào)用

27.建一個工程用到的最基本的兩個框架是?

FoundationUIKit

28,一個UITableview的實例,重新加載數(shù)據(jù)的方法是什么?

reloadData刷新整個表格和reloadSections:withRowAnimation刷新一組數(shù)據(jù)

29.XML有哪幾種解析方式,他們各有什么優(yōu)點

答:有Sax和Dom兩種解析方式,sax是逐行解析。dom是一次性全部加載xml文件,然后解析

29.iOS平臺怎么做數(shù)據(jù)持久化

有以下方式做

1、NSUserDefaults

2、Plist

3、數(shù)據(jù)庫

4、文件保存

5、歸檔與反歸檔

30.intretVal=UIApplication(argc,argv,nil,nil):是什么意思

對UIApplication對象進行了初始化,這個方法除了argc和argv參數(shù)外,另外這個函數(shù)還有2個兩個字符串參數(shù)來識別UIApplication類和UIApplication代理類,在這里默認是2個nil,第一個參數(shù)為nil就默認把UIApplication類作為缺省值進行初始化,可以在這里不填nil而是使用自己定義的UIApplication子類。至于第二個參數(shù)nil就設置為nil就把模板生成的HelloWorldAppdelegate類作為默認值。

31.iOS平臺怎么做數(shù)據(jù)的持久化?Core Data和SQLite有無必然聯(lián)系?Core Data是一個關(guān)系型數(shù)據(jù)庫嗎?

答:iOS中可以有四種持久化數(shù)據(jù)的方式: 屬性列表、對象歸檔、SQLite3和Core Data

Core data與sqlite還是有聯(lián)系的,core

data是對sqlite的封裝,因為sqlite是c語言的api,然而有人也需要obj-c的api,所以有了core data另外,core data不僅僅是把c的api翻譯成oc的api,還提供了一些管理的功能,使用更加方便

Core

Data不是一個關(guān)系型數(shù)據(jù)庫,也不是關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。雖然Core Dta支持SQLite作為一種存儲類型,但它不能使用任意的SQLite數(shù)據(jù)庫。Core Data在使用的過程種自己創(chuàng)建這個數(shù)據(jù)庫。Core Data支持對一、對多的關(guān)系

32.runloop是什么?在主線程中的某個函數(shù)里調(diào)用了異步函數(shù),怎么樣block當前線程,且還能響應timer事件,touch事件等?

RunLoop

RunLoop從字面上看是運行循環(huán)的意思,這一點也不錯,它確實就 是一個循環(huán)的概念,或者準確的說是線程中的循環(huán)。 本文一開始就 提到有些程序是一個圈,這個圈本質(zhì)上就是這里的所謂的RunLoop,就是一個循環(huán),只是這個循環(huán)里加入很多特性。 首先循環(huán)體的開始需要檢測是否有需要處理的事件,如果有則去處理,如果沒有則進入睡眠以節(jié)省CPU時間。 所以重點便是這個需要處理的事件,在RunLoop中,需要處理的事件分兩類,一種是輸入 源,一種是定時器,定時器好理解就是那些需要定時執(zhí)行的操作,

輸入源分三類:performSelector源,基于端口(Mach port)的源,以及自定義的源。編程的時候可以添加自己的源。RunLoop還有一 個觀察者Observer的概念,可以往RunLoop中加入自己的觀察者以 便監(jiān)控著RunLoop的運行過程,CFRunLoop.h中定義了所有觀察者的

類型:1enumCFRunLoopActivity { kCFRunLoopEntry = (1 << 0), kCF

RunLoopBeforeTimers = (1 << 1),kCFRunLoopBeforeSour

ces = (

如果你使用過select系統(tǒng)調(diào)用寫過程序你便可以快速的理解runloop事

件源的概念,本質(zhì)上講事件源的機制和select一樣是一種多路復用IO的實現(xiàn),在一個線程中我們需要做的事情并不單一,如需要處理定時鐘事件,需要處理用戶的觸控事件,需要接受網(wǎng)絡遠端發(fā)過來的 數(shù)據(jù),將這些需要做的事情統(tǒng)統(tǒng)注 冊到事件源中,每一次循環(huán)的開 始便去檢查這些事件源是否有需要處理的數(shù)據(jù),有的話則去處理。 拿具體的應用舉個例子,NSURLConnection網(wǎng)絡數(shù)據(jù)請求,默認是 異步的方式,其實現(xiàn)原理就是創(chuàng)建之后將其作為事件源加入到當前的RunLoop,而等待網(wǎng)絡響應以及網(wǎng)絡數(shù)據(jù)接受的過程則在一個新創(chuàng)建的獨立的線程中完成,當這個線程處理到某個階段的時候比如 得到對方的響應或者接受完 了網(wǎng)絡數(shù)據(jù)之后便通知之前的線程去執(zhí)行其相關(guān)的delegate方法。所以在Cocoa中經(jīng)??吹絪cheduleInRunLoop:forMode:這樣的方法,這個便是將其加入到事件 源中,當檢測到某個事件發(fā)生的時候,相關(guān)的delegate方法便被調(diào)用。對于CoreFoundation這一層而 言,通常的模式是創(chuàng)建輸入源,然后 將輸入源通過CFRunLoopAddSource函數(shù)加入到RunLoop中,相關(guān)事件發(fā)生后,相關(guān)的回調(diào)函數(shù)會被調(diào)用。如CFSocket的使用。 另外RunLoop中還有一個運行模式的概念,每一個運行循環(huán)必然運行在 某個模式下,而模式的存在是為了過濾事件源和觀察者的,只有那 些和當前RunLoop運行模式一致的事件源和觀察者才會被激活。 每一個線程都有其對應的RunLoop,但是默認非主線程的RunLoop是沒有運行的,需要為RunLoop添加至少一個事件源,然后去run它。一般情況下我們是沒有必要去啟用線程的RunLoop的,除非你 在一個單獨的線程中需要長久的檢測某個事件。

33.使用UITableView必須要實現(xiàn)的兩個方法?

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section,-

(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath

34.簡述以下在iOS中使用SQLIte

_fmdb= [[FMDatabasealloc]initWithPath:path];

[_fmdbopen];

[_fmdbexecuteUpdate:@"create

table Article(ArticleId integer primary key autoincrement,ArticleTitle

text,ArticleContent text)"];

[_fmdbclose];

35.設計一個新聞瀏覽需要用到哪些技術(shù)

網(wǎng)絡下載,數(shù)據(jù)解析,表單控件等

36.談談你對多線程的理解

iOS多線程分為三種NSThread,NSOperation,GCD,NSThread以線程為導向,NSOperation以任務為導向,GCD是Block模式的NSOperation

36.ViewController的loadView,viewDidLoad,viewDidUnload分別是在什么時候調(diào)用的?在自定義ViewController的時候這幾個函數(shù)里面應該做做什么工作?

loadView:

每次訪問UIViewController的view(比如controller.view、self.view)而且view為nil,loadView方法就會被調(diào)用。

自定義UIViewController的view用的

viewDidLoad:

無論你是通過xib文件還是重寫loadView方法創(chuàng)建UIViewController的view,在view創(chuàng)建完畢后,最終都會調(diào)用viewDidLoad方法

一般我們會在這里做界面上的初始化操作,比如往view中添加一些子視圖、從數(shù)據(jù)庫或者網(wǎng)絡加載模型數(shù)據(jù)裝配到子視圖中。

viewDidUnload:

發(fā)出內(nèi)存警告且view被釋放的時候就會調(diào)用viewDidUnload方法

一般在此釋放資源,主要是釋放界面元素相關(guān)的資源,將相關(guān)的實例都賦值為nil

37.你用過NSOperationQueue么?如果用過或者了解的話,你為什么要使用NSOperationQueue,實現(xiàn)了什么?請描述它和GCD的區(qū)別和類似的地方(提示:可以從兩者的實現(xiàn)機制和適用范圍來描述)。

使用NSOperationQueue用來管理子類化的NSOperation對象,控制其線程并發(fā)數(shù)目。GCD和NSOperation都可以實現(xiàn)對線程的管理,區(qū)別是NSOperation和NSOperationQueue是多線程的面向?qū)ο蟪橄蟆m椖恐惺褂肗SOperation的優(yōu)點是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結(jié)構(gòu)更好,子類化NSOperation的設計思路,是具有面向?qū)ο蟮膬?yōu)點(復用、封裝),使得實現(xiàn)是多線程支持,而接口簡單,建議在復雜項目中使用。

項目中使用GCD的優(yōu)點是GCD本身非常簡單、易用,對于不復雜的多線程操作,會節(jié)省代碼量,而Block參數(shù)的使用,會是代碼更為易讀,建議在簡單項目中使用。

38.談談對swift的看法

Swift作為Apple欽定的objc的繼承者,作為iOS/Mac開發(fā)者的話,是覺得必須和值得學習和使用的?,F(xiàn)在Swift可以和原來的objc或者c系的代碼混用。因為在很多語法特性上Swift確實和一些腳本非常相似。但是首先需要明確的是,至少在Apple開發(fā)中,Swift不是以一種腳本語言來運行的,所有的Swift代碼都將被LLVM編譯為native code,以極高的效率運行。按照官方今天給出的benchmark數(shù)據(jù),運行時比Python快3.9倍,比objc快1.4倍左右。我相信官方數(shù)據(jù)肯定是有些水分,但是即使這樣,Swift也給人帶來很多遐想和期待。Swift和原來的objc一樣,是類型安全的語言,變量和方法都有明確的返回,并且變量在使用前需要進行初始化。而在語法方面,Swift遷移到了業(yè)界公認的非常先進的語法體系,其中包含了閉包,多返回,泛型和大量的函數(shù)式編程的理念,函數(shù)也終于成為一等公民可以作為變量保存了(雖然具體實現(xiàn)和用法上來看和js那種傳統(tǒng)意義的好像不太一樣)。初步看下來語法上借鑒了很多Ruby的人性化的設計,但是借助于Apple自己手中強大的LLVM,性能上必須要甩開Ruby不止一兩個量級。

另一方面,Swift的代碼又是可以Interactive來“解釋”執(zhí)行的。新的Xcode中加入了所謂的Playground來對開發(fā)者輸入的Swift代碼進行交互式的相應,開發(fā)者也可是使用swift的命令行工具來交互式地執(zhí)行swift語句。細心的朋友可能注意到了,我在這里把“解釋”兩個字打上了雙引號。這是因為即使在命令行中,Swift其實也不是被解釋執(zhí)行的,而是在每個指令后進對從開始以來的swift代碼行了一遍編譯,然后執(zhí)行的。這樣的做法下依然可以讓人“感到”是在做交互解釋執(zhí)行,這門語言的編譯速度和優(yōu)化水平,可見一斑。同時Playground還順便記錄了每條語句的執(zhí)行時候的各種情況,叫做一組timeline。可以使用timeline對代碼的執(zhí)行逐步檢查,省去了斷點debug的時間,也非常方便。

39.簡述一下IOS中線程同步機制

1:原子操作不同線程如果通過原子操作函數(shù)對同一變量進行操作,可以保證一個線程的操作不會影響到其他線程內(nèi)對此變量的操作,因為這些操作都是原子式的。因為原子操作只能對內(nèi)置類型進行操作,所以原子操作能夠同步的線程只能位于同一個進程的地址空間內(nèi)。2:鎖iOS平臺下的鎖對象為NSLock對象,進入鎖通過調(diào)用lock函數(shù),解鎖調(diào)用unlock函數(shù)(因為iOS中大部分的線程同步類都繼承自NSLocking協(xié)議,所以其加鎖/解鎖的操作基本都為lock/unlock函數(shù)),同一個NSLock對象成功調(diào)用lock函數(shù)后,在其顯式unlock之前任何線程都不能再對此NSLock對象加鎖,以達到互斥訪問的目的。3:事件NSConditon類型提供了wait與signal函數(shù),分別代表了等待事件的操作以及觸發(fā)事件的操作。除了wait函數(shù),NSCondition還提供了waitUntilDate函數(shù),其功能與NSLock中的lockBeforeDate大致相同,簡要來說就是提供了一個帶超時的wait函數(shù)。

40.啟動一個線程,在子線程中如何刷新界面。

可以跳轉(zhuǎn)到主線程中進行界面的刷新,如[selfperformSelectorOnMainThread:@selector(updateUI) withObject:nilwaitUntilDone:YES];

41.簡述開發(fā)中使用過的設計模式。

(一)代理模式

應用場景:當一個類的某些功能需要由別的類來實現(xiàn),但是又不確定具體會是哪個類實現(xiàn)。

優(yōu)勢:解耦合

敏捷原則:開放-封閉原則

實例:tableview的數(shù)據(jù)源delegate,通過和protocol的配合,完成委托訴求。

列表row個數(shù)delegate

自定義的delegate

(二)觀察者模式

應用場景:一般為model層對,controller和view進行的通知方式,不關(guān)心誰去接收,只負責發(fā)布信息。

優(yōu)勢:解耦合

敏捷原則:接口隔離原則,開放-封閉原則

實例:Notification通知中心,注冊通知中心,任何位置可以發(fā)送消息,注冊觀察者的對象可以接收。

kvo,鍵值對改變通知的觀察者,平時基本沒用過。

(三)MVC模式

應用場景:是一中非常古老的設計模式,通過數(shù)據(jù)模型,控制器邏輯,視圖展示將應用程序進行邏輯劃分。

優(yōu)勢:使系統(tǒng),層次清晰,職責分明,易于維護

敏捷原則:對擴展開放-對修改封閉

實例:model-即數(shù)據(jù)模型,view-視圖展示,controller進行UI展現(xiàn)和數(shù)據(jù)交互的邏輯控制。

(四)單例模式

應用場景:確保程序運行期某個類,只有一份實例,用于進行資源共享控制。

優(yōu)勢:使用簡單,延時求值,易于跨模塊

敏捷原則:單一職責原則

實例:[UIApplication sharedApplication]。

注意事項:確保使用者只能通過getInstance方法才能獲得,單例類的唯一實例。

java,C++中使其沒有公有構(gòu)造函數(shù),私有化并覆蓋其構(gòu)造函數(shù)。

object c中,重寫allocWithZone方法,保證即使用戶用alloc方法直接創(chuàng)建單例類的實例,

返回的也只是此單例類的唯一靜態(tài)變量。

(五)策略模式

應用場景:定義算法族,封裝起來,使他們之間可以相互替換。

優(yōu)勢:使算法的變化獨立于使用算法的用戶

敏捷原則:接口隔離原則;多用組合,少用繼承;針對接口編程,而非實現(xiàn)。

實例:排序算法,NSArray的sortedArrayUsingSelector;經(jīng)典的鴨子會叫,會飛案例。

注意事項:1,剝離類中易于變化的行為,通過組合的方式嵌入抽象基類

2,變化的行為抽象基類為,所有可變變化的父類

3,用戶類的最終實例,通過注入行為實例的方式,設定易變行為

防止了繼承行為方式,導致無關(guān)行為污染子類。完成了策略封裝和可替換性。

(六)工廠模式

應用場景:工廠方式創(chuàng)建類的實例,多與proxy模式配合,創(chuàng)建可替換代理類。

優(yōu)勢:易于替換,面向抽象編程,application只與抽象工廠和易變類的共性抽象類發(fā)生調(diào)用關(guān)系。

敏捷原則:DIP依賴倒置原則

實例:項目部署環(huán)境中依賴多個不同類型的數(shù)據(jù)庫時,需要使用工廠配合proxy完成易用性替換

注意事項:項目初期,軟件結(jié)構(gòu)和需求都沒有穩(wěn)定下來時,不建議使用此模式,因為其劣勢也很明顯,

增加了代碼的復雜度,增加了調(diào)用層次,增加了內(nèi)存負擔。所以要注意防止模式的濫用。

42.UIViewController中的viewDidLoad,viewWillAppear,viewDidUnload,dealloc分別是在什么時候調(diào)用?

viewDidLoad:方法

在視圖加載后被調(diào)用:

如果是在代碼中創(chuàng)建的視圖加載器,他將會在loadView方法后被調(diào)用;

如果是從nib視圖頁面輸出,他將會在視圖設置好后后被調(diào)用。

重載重寫該方法以進一步定制view

在iPhone OS 3.0及之后的版本中,還應該重載重寫viewDidUnload來釋放對view的任何索引

viewDidLoad后調(diào)用數(shù)據(jù)Model

viewWillAppear:方法

Called when the view is about to made visible. Defaultdoes nothing

視圖即將可見時調(diào)用。默認情況下不執(zhí)行任何操作viewDidUnload:方法

當系統(tǒng)內(nèi)存吃緊的時候會調(diào)用該方法(注:viewController沒有被dealloc)

內(nèi)存吃緊時,在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無用內(nèi)存的唯一方式,但是OS

3.0及以后viewDidUnload方法是更好的方式

在該方法中將所有IBOutlet(無論是property還是實例變量)置為nil(系統(tǒng)release

view時已經(jīng)將其release掉了)

在該方法中釋放其他與view有關(guān)的對象、其他在運行時創(chuàng)建(但非系統(tǒng)必須)的對象、在viewDidLoad中被創(chuàng)建的對象、緩存數(shù)據(jù)等release對象后,將對象置為nil(IBOutlet只需要將其置為nil,系統(tǒng)release

view時已經(jīng)將其release掉了)

一般認為viewDidUnload是viewDidLoad的鏡像,因為當view被重新請求時,viewDidLoad還會重新被執(zhí)行

viewDidUnload中被release的對象必須是很容易被重新創(chuàng)建的對象(比如在viewDidLoad或其他方法中創(chuàng)建的對象),不要release用戶數(shù)據(jù)或其他很難被重新創(chuàng)建的對象

dealloc:方法

viewDidUnload和dealloc方法沒有關(guān)聯(lián),dealloc還是繼續(xù)做它該做的事情

43.navigationbar的背景顏色設置

UINavigationController* nav =[[UINavigationController alloc] init];

self.nav.navigationBar.tintColor =[UIColor blackColor];

44.tableviewcell的那幾個函數(shù)

// Designated initializer.If the cell can be reused, you must pass in areuse identifier.You should use thesame reuse identifier for all cells of the same form.

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier

- (void)prepareForReuse;// if the cell is reusable (has a reuse identifier), this is called justbefore the cell is returned from the table view methoddequeueReusableCellWithIdentifier:.Ifyou override, you MUST call super.

- (void)setSelected:(BOOL)selectedanimated:(BOOL)animated;// animate between regular and selected state

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated;// animate between regular andhighlighted state

- (void)setEditing:(BOOL)editinganimated:(BOOL)animated;

45.還有動畫

在iOS中動畫實現(xiàn)技術(shù)主要是:Core Animation。

Core Animation負責所有的滾動、旋轉(zhuǎn)、縮小和放大以及所有的iOS動畫效果。其中UIKit類通常都有animated:參數(shù)部分,它可以允許是否使用動畫。

Core Animation主要是使用

我們知道每個UIView都關(guān)聯(lián)到一個CALayer對象,CALayer是Core Animation中的圖層。

Core Animation主要就是通過修改圖層來改變UI的大小,位置,從而實現(xiàn)動畫效果。

可以說,任何一個應用程序都離不開動畫!

就連蘋果各個UI控件中的切換操作,都有它內(nèi)在的動畫。

了解一下,關(guān)于動畫的一些知識。

任何知識點,都會遷出一系列的知識點。

[UIViewbeginAnimations:@"dropDownloadLabel"context:UIGraphicsGetCurrentContext()];

[UIView setAnimationDuration: 0.5];

[UIViewsetAnimationBeginsFromCurrentState: NO];

//執(zhí)行的動畫code

[UIView commitAnimations];

就將這段段代碼作為知識的切入點,開始了解吧。

[UIViewbeginAnimations:@"dropDownloadLabel"context:UIGraphicsGetCurrentContext()];

[UIView commitAnimations];

這兩句代碼,標記了一個動畫的開始和結(jié)束。在中間我們可以寫我們的一些動畫操作!

beginAnimations方法

+ (void)beginAnimations:(NSString*)animationID context:(void *)context

用來,表示動畫的開始。

animationID:作為動畫的標識

context:自定義的一些動畫數(shù)據(jù),這些數(shù)據(jù)將發(fā)送給動畫的代理方法:setAnimationWillStartSelector:方法和setAnimationDidStopSelector:方法。

這個,參數(shù),通常為nil。我們可以直接設置為nil。

這里,我們使用UIGraphicsGetCurrentContext();因為此方法默認也會返回nil。

該方法告訴系統(tǒng),我們將開始動畫。并且,在該方法后,我們可以通過setAnimationXXX(一系列方法)來設置我們進行的動畫的一些參數(shù)。

完成動畫后,調(diào)用commitAnimations方法來通知系統(tǒng),動畫結(jié)束。

至此,我們知道,就是設置動畫的一些列參數(shù)的方法即setAnimationXXX方法。

[UIView setAnimationDuration: 0.5];

[UIViewsetAnimationBeginsFromCurrentState: NO];

動畫是可以嵌套的。

[UIViewbeginAnimations:@"animation_1"context:UIGraphicsGetCurrentContext()];

// code1

[UIViewbeginAnimations:@"animation_2"context:UIGraphicsGetCurrentContext()];

// code2

[UIView commitAnimations];

[UIView commitAnimations];

如果我們?yōu)閯赢嬙O置了,setAnimationWillStartSelector:方法和setAnimationDidStopSelector:方法。

那么當動畫開始或者停止的時候,動畫的animationID參數(shù)和context參數(shù),會傳遞給setAnimationWillStartSelector:方法和setAnimationDidStopSelector:方法。

悲劇總是要發(fā)生的!

蘋果API在最后的描述中,給了這么一句話:

Use of this method is discouraged iniOS 4.0 and later. You should use the block-based animation methods to specifyyour animations instead.

可見,在iOS 4.0后,block語法,大大增多了。這種方式,是不建議的,需要我們使用block的方式。

于是,動畫的block方式:

[UIView animateWithDuration:0.3fdelay:0.0f options:UIViewAnimationOptionCurveLinear

animations:^{ //執(zhí)行的動畫code}

completion:^(BOOLfinished){

//完成后執(zhí)行code

}];

在盡量用block來完成動畫,因為說不定啥時候,老的動畫方式,將被廢除。

到此,可以告一段落。但是,我想將這簡單的動畫代碼,一查到底!

commitAnimations方法:

+ (void)commitAnimations

標記動畫結(jié)束。與beginAnimations方法成對使用。

例如:

[UIView commitAnimations];

一系列的setAnimationXXX方法:

setAnimationDuration方法:

+(void)setAnimationDuration:(NSTimeInterval)duration

設置動畫持續(xù)時間(秒)

例如:

[UIView setAnimationDuration: 0.5];

setAnimationBeginsFromCurrentState方法

+(void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState

設置動畫開始時的狀態(tài)。

我們構(gòu)想一個場景:一般,我們按下一個按鈕,將會執(zhí)行動畫一次。

當YES時:當上一次動畫正在執(zhí)行中,那么當下一個動畫開始時,上一次動畫的當前狀態(tài)將成為下一次動畫的開始狀態(tài)。

當NO時:當上一個動畫正在執(zhí)行中,那么當下一個動畫開始時,上一次動畫需要先恢復到完成時的狀態(tài),然后在開始執(zhí)行下一次動畫。

setAnimationStartDate方法

+ (void)setAnimationStartDate:(NSDate*)startTime

設置動畫開始時間。

setAnimationDelay方法

+(void)setAnimationDelay:(NSTimeInterval)delay

設置畫開始的延遲時間(秒)。

setAnimationCurve方法

+ (void)setAnimationCurve:(UIViewAnimationCurve)curve

設置動畫的曲線方式(就是動畫的總體變化的時間曲線:開始快最后慢,開始慢最后快,最后慢,均勻線性)。

curve參數(shù)如下:

typedef NS_ENUM(NSInteger,UIViewAnimationCurve) {

UIViewAnimationCurveEaseInOut,// slow at beginning and end

UIViewAnimationCurveEaseIn,// slow at beginning

UIViewAnimationCurveEaseOut,// slow at end

UIViewAnimationCurveLinear

};

setAnimationRepeatCount方法

+(void)setAnimationRepeatCount:(float)repeatCount

設置動畫重復次數(shù)

setAnimationRepeatAutoreverses方法

+(void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses

設置動畫是否做一次反向的執(zhí)行。

如果設置為YES:動畫將執(zhí)行:動畫初始狀態(tài)》動畫》動畫完成狀態(tài)》動畫》動畫初始狀態(tài)。

如果設置為NO:默認值

setAnimationsEnabled方法

+(void)setAnimationsEnabled:(BOOL)enabled

設置動畫是否可用!

YES:默認值。

NO:動畫效果被禁用

注意:僅僅是動畫是否可用,在動畫中被改變的UI對象依然是起作用的。僅僅是動畫效果被禁用了。

areAnimationsEnabled方法

+ (BOOL)areAnimationsEnabled

返回動畫效果是否被禁用。

46.還有一個按著導航欄顏色變亮的

_myNav.navigationBar.translucent =YES;

_myNav.navigationBar.barStyle =UIBarStyleBlack;

47.還有個版本的問題

一、配置SVN服務器

1、創(chuàng)建Svn服務工作路徑同時新建我們的App工程,入下圖所示,SVN_Project是SVN服務的工作路徑,MyProject是我們的iOS工程

2,在Mac下有自帶的svn服務功能(Windows下是沒有的),直接在終端打開svn的服務即可,在打開服務的同時指定svn的工作路徑

(1)啟動svn服務命令:svnserve -d -r工作路徑:

(2)終端截圖如下:

3、svn服務啟動后,要創(chuàng)建svn管理文件,管理文件有關(guān)于svn的各種配置

(1)在工作目錄中創(chuàng)建管理文件命令:svnadmin create MySVNProject

(2)管理文件創(chuàng)建成功后,其目錄結(jié)構(gòu)如下:

(3)接下來要配置我們的svn,打開conf文件夾如下:

(4)配置svnserve.conf文件,把帶一個#的臨時注釋去掉即可:

(5)在passwd中添加用戶名和密碼

(6)authz中是用戶組的管理

二.把工程導入SVN

1.想把我們的工程導入svn的話,需要用到一個工具svnx,svnx連接svn服務器,后面跟的文件是SVN的管理文件,用戶名和密碼就是在配置文件中添加的用戶名和密碼

2.登陸成功以后,導入我們的iOS工程。

三、在Xcode中check out工程(下面用的時Xcode6.1的測試版本)

1.在Welcome Xcode中選中Check out an existing

Project,入下圖所示:

2.連接svn服務器(ip后面的仍然是svn管理文件):

3、check out工程

4.在本地打開工程,在Source Control中進行項目的管理

有自己的產(chǎn)品也有外包

編程:

1、給定字符串的長度,還有換行方式算出高度。

UIFont *font = [UIFont systemFontOfSize:14];

CGSize size = [text sizeWithFont:fontconstrainedToSize:CGSizeMake(140, 1000)lineBreakMode:UILineBreakModeCharacterWrap];

2.寫一個發(fā)送同步http請求,并獲得返回結(jié)果的方法。

NSMutableURLRequest *request = [[NSMutableURLRequestalloc] init];

[requestsetURL:[NSURL URLWithString:urlStr]];

[requestsetHTTPMethod:@"GET"];

NSData*returnData = [NSURLConnection sendSynchronousRequest:request

returningResponse:nil error:nil];

[requestrelease];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.描述什么是MVC 【MVC簡介】 是一種架構(gòu)模式,它是蘋果非常熱衷的一種架構(gòu)模式 M:model模型保存所有應...
    爵笙彥閱讀 2,970評論 1 33
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,619評論 30 472
  • 1,NSObject中description屬性的意義,它可以重寫嗎?答案:每當 NSLog(@"")函數(shù)中出現(xiàn) ...
    eightzg閱讀 4,340評論 2 19
  • OC的理解與特性 OC作為一門面向?qū)ο蟮恼Z言,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承、多態(tài)。它既具有靜態(tài)語言的特性...
    克魯?shù)吕?/span>閱讀 503評論 0 0
  • OC的理解與特性OC作為一門面向?qū)ο蟮恼Z言,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承、多態(tài)。它既具有靜態(tài)語言的特性(...
    LIANMING_LI閱讀 580評論 0 0

友情鏈接更多精彩內(nèi)容