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];