以下內容均來自網絡,記下來以供自己學習
1. 比較GCD 和 NSOperation異同
相同點:GCD和NSOperation都是蘋果提供的多線程實現方案。
不同點:GCD是輕量級的純C寫的多線程實現方案,使用起來非常方便,在開發中大量使用,但是對于取消和暫停線程就比較麻煩些。而NSOperation是面向對象的,兼容KVO,對于取消和暫停任務是非常容易的。
(GCD是基于c的底層api,NSOperation屬于object-c類。
相對于GCD:
1.NSOperation擁有更多的函數可用,具體查看api。
2.在NSOperationQueue中,可以建立各個NSOperation之間的依賴關系。
3.有kvo,可以監測operation是否正在執行(isExecuted)、是否結束(isFinished),是否取消(isCanceld)。
4.NSOperationQueue可以方便的管理并發、NSOperation之間的優先級。
gcd主要與block結合使用。
具體使用哪個,依需求而定。)
? GCD是基于C的底層API
? NSOperation屬于object-c類。
? iOS首先引入的是NSOperation,IOS4之后引入了GCD和NSOperationQueue并且其內部是用GCD實現的。
NSOperation:
1 - NSOperation擁有更多的函數可用,具體查看API。
2 - 在NSOperationQueue中,可以建立各個NSOperation之間的依賴關系。
3 - 有KVO,可以監測operation是否
--------------------------正在執行isExecuted、
--------------------------是否結束isFinished、
--------------------------是否取消isCanceld;
4 - NSOperationQueue可以方便的管理并發、NSOperation之間的優先級。
NSOperationQueue的隊列類型
? 主隊列
o [NSOperationQueue mainQueue]
o 凡是添加到主隊列中的任務(NSOperation),都會放到主線程中執行
? 非主隊列(其他隊列)
o [[NSOperationQueue alloc] init]
o 同時包含了:串行、并發功能
o 添加到這種隊列中的任務(NSOperation),就會自動放到子線程中執行
GCD:
1 - 主要與block結合使用。代碼簡潔高效。
2 - GCD也可以實現復雜的多線程應用,主要是建立個個線程時間的依賴關系這類的情況,但是需要自己實現相比NSOperation要復雜。具體使用哪個,依需求而定。
GCD的隊列類型
并發隊列
- 全局
- 自己創建的
串行隊列
- 主隊列
- 自己創建的
從個人使用的感覺來看,比較合適的用法是:除了依賴關系盡量使用GCD,因為蘋果專門為GCD做了性能上面的優化。
2 . UIViewController的生命周期方法有哪些 ?
當一個視圖控制器被創建,并在屏幕上顯示的時候。 代碼的執行順序
- alloc 創建對象,分配空間
- init 初始化對象,初始化數據
- loadView 從nib載入視圖 ,通常這一步不需要去干涉。
- viewDidLoad 載入完成,可以進行自定義數據以及動態創建其他控件
- viewWillAppear 視圖將出現在屏幕之前,馬上這個視圖就會被展現在屏幕上了
- viewDidAppear 視圖已在屏幕上渲染完成
當一個視圖被移除屏幕并且銷毀的時候的執行順序,這個順序差不多和上面的相反
- viewWillDisappear 視圖將被從屏幕上移除之前執行
- viewDidDisappear 視圖已經被從屏幕上移除,用戶看不到這個視圖了
3 . dealloc 視圖被銷毀,此處需要對你在init和viewDidLoad中創建的對象進行釋放
關 于viewDidUnload :在發生內存警告的時候如果本視圖不是當前屏幕上正在顯示的視圖的話, viewDidUnload將會被執行,本所有子視圖將被銷毀,以釋放內存。 因此當這個視圖再次顯示在屏幕上的時候,viewDidLoad 再次被調用,以構造視圖。
3 . 代理為什么使用weak
屬性關系有兩種主要類型:strong和weak,相當于非ARC環境里的retain和assign。只要存在一個強引用,對象就會一直存在,不會被銷毀。
Objective-C中一直存在循環引用的問題,但在實際應用中很少出現循環引用。對于過去那些使用assign屬性的地方,在ARC環境中要使用weak代替。大部分引用循環是由委托(delegate)引起的,所以應該總是把delegate屬性聲明為weak。當引用的對象被銷毀之后,weak引用會被自動置為nil,與assign相比這是一個巨大的進步,因為assign可以指向被釋放掉的內存,導致程序崩潰
assign 是直接賦值,而retain是引用引數加1;使用retain容易出現內存錯誤。
一個對象沒必要管理自己delegate的生命周期,或者說沒必要擁有該對象,所以只要知道它的指針就可以了,用指針找到對象去調用方法,也就是委托的實現。
或者換個角度,從內存管理方面也可以解釋這個問題。delegate的生命周期不需要讓該對象去控制,如果該對象對其使用retain很可能導致delegate所指向的對象無法正確的釋放。
assign: 簡單賦值,不更改索引計數
weak比assign多了一個功能,當對象消失后自動把指針變成nil
weak屬性的變量是不為其所屬對象持有的,并且在該變量被銷毀之后,此weak變量的值會自動被賦值為nil。而assign屬性一般是對C基本數據類型成員變量的聲明,當然也可以用在對象類型成員變量上,只是其代表的意義只是單純地拷貝所賦值變量的值。
4 . CALayer和UIView的關系
1 .首先UIView可以響應事件,Layer不可以:
UIView(UIWindow,UIApplication,UIViewController)繼承于UIResponder,在UIResponder中系統定義處理各種事件和事件傳遞的接口(touchesBegan:withEvent),而CALayer直接繼承于NSObject,并沒有相應的處理事件接口2 . View中frame getter方法,bounds和center,UIView并沒有做什么工作;它只是簡單的各自調用它底層的CALayer的frame,bounds和position方法(position:用來設置CALayer在父層中的位置以父層的左上角為原點(0, 0))
3 .
UIView主要是對顯示內容的管理而 ,CALayer 主要側重顯示內容的繪制。
每個 UIView 內部都有一個 CALayer 在背后提供內容的繪制和顯示,并且 UIView 的尺寸樣式都由內部的 Layer 所提供。兩者都有樹狀層級結構,layer 內部有 SubLayers,View 內部有 SubViews.但是 Layer 比 View 多了個AnchorPoint
在 View顯示的時候,UIView 做為 Layer 的 CALayerDelegate,View 的顯示內容由內部的 CALayer 的 display
CALayer 是默認修改屬性支持隱式動畫的,在給 UIView 的 Layer 做動畫的時候,View 作為 Layer 的代理,Layer 通過 actionForLayer:forKey:向 View請求相應的 action(動畫行為)
layer 內部維護著三分 layer tree,分別是 presentLayer Tree(動畫樹),modeLayer Tree(模型樹), Render Tree (渲染樹),在做 iOS動畫的時候,我們修改動畫的屬性,在動畫的其實是 Layer 的 presentLayer的屬性值,而最終展示在界面上的其實是提供 View的modelLayer
兩者最明顯的區別是 View可以接受并處理事件,而 Layer 不可以
5 .imageNamed 和imageWithContentOfFile區別
- imageNamed是會把讀取到的image存在某個緩存里面,第二次讀取相同圖片的話系統就會直接從那個緩存中獲取,從某種意義上好像一種優化,但是imageNamed讀取到的那個圖片似乎不會因為Memory Warning而釋放,所以用這個會導致在內存不足的時候閃退。簡單的說imageNamed采用了緩存機制,如果緩存中已加載了圖片,直接從緩存讀就行了,每次就不用再去讀文件了,效率會更高
使用imageNamed:加載圖片
加載到內存中后,會一直停留在內存中,不會隨著對象銷毀而銷毀
加載進圖片后,占用的內存歸系統管理,我們無法管理
相同的圖片,圖片不會重新加載
加載到內存中后,占據內存空間較大
使用 imageWithContentOfFile:加載圖片
1 加載到內存中后,占據內存空間比較小
2 相同的圖片會被重復加載到內存中
對象銷毀的時候,加載到內存中得圖片會被一起銷毀
6 .常見的OC數據類型有哪些,和C基本數據類型有什么區別
object-c的數據類型有nsstring,nsnumber,nsarray,nsmutablearray,nsdata等等,這些都是class,創建后便是對象,而c語言的基本數據類型int,只是一定字節的內存空間,用于存放數值;而object-c的nsnumber包含有父nsobject的方法和nsnumber自己的方法,可以完成復雜的操作。
而且OC還新增了一些數據類型:
基本數據類型:BOOL類型(只有兩個取值真或者假)
指針類型:類(Class);id類型指針,NSObject *OC 中的對象類型,動態對象類型,萬能指針----動態類型:就是指針的id類型.動態類型和靜態類型相對, 像內置的明確的基本數據類型都屬于靜態類型(int,NSString等).靜態類型在編譯的時候就能被識別出來.所以若是程序發生了類型不對應,編譯器就會發出警告. 而動態類型就編譯器編譯的時候是不能被識別的,要等到運行時(run time),即程序運行時才會根據語境來識別.所以這里面就有兩個概念要分清:編譯時和運行時.
Block類型:block類型,代碼塊數據類型
特殊類型:SEL,nil,選擇器數據類型
7 . 什么時候使用delegate,什么時候使用notifaction
- Delegate是一種點對點的消息傳送機制。傳遞給自己或者其他對象。有時候他還會返回一個影響事件如何被處理的值。
- Notification是一種一對多的消息傳遞方式。他的實質是廣播信息給所有observer。消息發送者不需要知道誰是消息的接收者。他減少了對象之間的依賴。
- 優先使用delegate因為使用代理可以更好的理解controller之間的通信,增強代碼可讀性,使用通知中心:當你程序中的所有controller都需要知道一件事情
(代理:一般控件用的比較多,其實也可以用block實現,如果實現的接口比較多的話,建議用代理,如UITableview。
如果一個類能夠獲取到通知的對象,這種情況下,我們用代理的效率會更高,而且能夠更好的實現對要代理的對象的管理。
通知:這東西是全局的,而且是同步的,如果你要全局發送消息,并且做的事情時間不長,不會阻塞線程的話,建議使用。
如果一個通知的發送者有多個接受者,而且接受的位置完全不確定,那么這種情況下用通知是比較好的方式
)
8 . 屬性語義設置解釋
1.readwrite表示讀寫設置中的可讀可寫(讀寫設置的默認值),編譯器會為讀寫設 置聲明為”readwrite”的屬性自動合成setter和getter方法。
2.readonly表示讀寫設置中的只讀,編譯器會為讀寫設置聲明為”readonly“的屬性 自動合成”getter”方法,而不合成”setter“方法。
3 .assign是語義設置(語義設置的默認值),使用assign修飾的屬性所對應的讀寫方 法中不會操作內存的引用計數,所以一般將不需要程序員管理的數據類型聲明為 assign,如基本數據類型和結構體類型。
4 .retain是語義設置,使用retain修飾的屬性所對應的讀寫方法中會對內存的引用計 數進行操作,以保證持有的對象不會被意外回收,OC中的對象使用retain修飾。
5 .copy是語義設置,使用copy修飾的屬性所對應的讀寫方法中會將將要持有的對象 拷貝一份,并持有對象的副本而不是原對象。對于OC中的可變對象,使用copy修飾, 是”深拷貝“,在內存中生成一塊新的內存空間,將原對象拷貝到新空間中;對于OC 中的不可變對象,使用copy修飾,是”淺拷貝“,只拷貝對象的內存地址。
6 .atomic:是原子特性(原子設置的默認值),在多線程環境下,使用atomic會保 證在同一時刻只有一條線程修改、訪問對應的實例變量,保證了實例變量在多線程環 境下的安全性,但是比較耗費資源,所以只有對于需要線程安全的屬性才使用atomic 來修飾。
7 .nonatomic:是原子特性,在多線程環境下不能保證線程安全,這種設置不會消 耗過多的資源,所以不需要保證多線程環境中線程安全的屬性,聲明為nonatomic。
8 .strong:ARC中的語義設置,相當于MRC中的retain,會操作內存的引用計數。
9 .week:ARC中的語義設置,相當于MRC中的assign,不僅不會操作內存的引用計 數,而且在對象被回收后,會將指針置為nil,防止”野指針“的出現。
9 .什么時候用NSMutableArray,什么時候用NSArray
NSArray是靜態的數組,就是它所指向的內容是不可改變的,它指向一段內存區域,一旦初始化,不能通過它對該內存區域的數據進行修改操作,但是它可以讀數據。
NSMutableArray是動態的是NSArray的子類,可以對所指向的內存區域內容進行更改,并可以增加數組內容
10 . NSNotification和KVO
兩者都是觀察者模式,不同的是,KVO是被觀察者直接發送消息給觀察者,是對象間的交互,而通知則是觀察者和被觀察者通過通知中心對象之間進行交互,即消息由被觀察者發送到通知中心對象,再由中心對象發給觀察者,兩者之間并不進行直接的交互
代理和前兩者的區別
代理只能一對一,一個對象只有一個代理,而KVO和通知可以一對多,一個通知可以發給多個觀察者
KVO是一個對象能夠觀察另外一個對象的屬性的值,并且能夠發現值的變化。前面兩種模式更加適合一個controller與任何其他的對象進行通信,而 KVO更加適合任何類型的對象偵聽另外一個任意對象的改變(這里也可以是controller,但一般不是controller)。這是一個對象與另外一 個對象保持同步的一種方法,即當另外一種對象的狀態發生改變時,觀察對象馬上作出反應。它只能用來對屬性作出反應,而不會用來對方法或者動作作出反應。必須在dealloc方法當中移除觀察者否則會崩潰
優點:
1.能夠提供一種簡單的方法實現兩個對象間的同步。例如:model和view之間同步;
2.能夠對非我們創建的對象,即內部對象的狀態改變作出響應,而且不需要改變內部對象(SKD對象)的實現;
3.能夠提供觀察的屬性的最新值以及先前值;
4.用key paths來觀察屬性,因此也可以觀察嵌套對象;
5.完成了對觀察對象的抽象,因為不需要額外的代碼來允許觀察值能夠被觀察
缺點:
1.我們觀察的屬性必須使用strings來定義。因此在編譯器不會出現警告以及檢查;
2.對屬性重構將導致我們的觀察代碼不再可用
11 . NSTimer使用時注意事項
1:如果想要銷毀timer,則必須先將timer置為失效,否則timer就一直占用內存而不會釋放。造成邏輯上的內存泄漏。該泄漏不能用xcode及instruments測出來。
另外對于要求必須銷毀timer的邏輯處理,未將timer置為失效,若每次都創建一次,則之前的不能得到釋放,則會同時存在多個timer的實例在內存中。
*注意timer在不需要時,一定要調用invalidate方法使定時器失效,否則得不到釋放- -(void)invalidate;
這個是唯一一個可以將計時器從runloop中移出的方法。
2: NSTime使用時,需要將timer加到runLoop中
12 . cocoa touch框架
Core Audio
Core Audio 是播放,處理和錄制音頻的專業技術,能夠輕松為您的應用程序添加強大的音頻功能。
Core Data
提供了一個面向對象的數據管理解決方案,它易于使用和理解,甚至可處理任何應用或大或小的數據模型。
下面是 Cocoa Touch 中一小部分可用的框架:
音頻和視頻:
Core Audio
Media Library
AV Foundation
數據管理:
Core Data
SQLite
圖形和動畫:
Core Animation
OpenGL
Quartz 2D
網絡:
WebKit
BSD Sockets
用戶應用:
Address Book
Core Location
Map Kit
Store Kit
13 . 內存管理
內存管理準則:誰強引用過,誰就在不再使用時使引用計數減一
對于內存的使用和優化常見的有以下方面:
重用問題:如UITableViewCells、UICollectionViewCells、UITableViewHeaderFooterViews設置正確的reuseIdentifier,充分重用。
盡量把views設置為不透明:當opque為NO的時候,圖層的半透明取決于圖片和其本身合成的圖層為結果,可提高性能。
不要使用太復雜的XIB/Storyboard:載入時就會將XIB/storyboard需要的所有資源,包括圖片全部載入內存,即使未來很久才會使用。那些相比純代碼寫的延遲加載,性能及內存就差了很多。
選擇正確的數據結構:學會選擇對業務場景最合適的數組結構是寫出高效代碼的基礎。比如,數組: 有序的一組值。使用索引來查詢很快,使用值查詢很慢,插入/刪除很慢。字典: 存儲鍵值對,用鍵來查找比較快。集合: 無序的一組值,用值來查找很快,插入/刪除很快。
gzip/zip壓縮:當從服務端下載相關附件時,可以通過gzip/zip壓縮后再下載,使得內存更小,下載速度也更快。
延遲加載:對于不應該使用的數據,使用延遲加載方式。對于不需要馬上顯示的視圖,使用延遲加載方式。比如,網絡請求失敗時顯示的提示界面,可能一直都不會使用到,因此應該使用延遲加載。
數據緩存:對于cell的行高要緩存起來,使得reload數據時,效率也極高。而對于那些網絡數據,不需要每次都請求的,應該緩存起來,可以寫入數據庫,也可以通過plist文件存儲。
處理內存警告:一般在基類統一處理內存警告,將相關不用資源立即釋放掉
重用大開銷對象:一些objects的初始化很慢,比如NSDateFormatter和NSCalendar,但又不可避免地需要使用它們。通常是作為屬性存儲起來,防止反復創建。
避免反復處理數據:許多應用需要從服務器加載功能所需的常為JSON或者XML格式的數據。在服務器端和客戶端使用相同的數據結構很重要。
使用Autorelease Pool:在某些循環創建臨時變量處理數據時,自動釋放池以保證能及時釋放內存。
正確選擇圖片加載方式:詳情閱讀細讀UIImage加載方式
14:項目目錄結構:
一個合理的目錄結構首先應該是清晰的,讓人一眼看上去就能大概了解目錄的職責,且容易應對新的變化。
目錄結構
AppDelegate 這個目錄下放的是AppDelegate.h(.m)文件,是整個應用的入口文件,單獨拿出來。
Models 這個目錄下放一些與數據相關的Model文件
BaseModel.h BaseModel.m…….
View(視圖):
Controller(控制器):
Expand(拓展):放一些工具類(Tool),宏,網絡(Network),分類(Category),數據庫(DataBase)等
Resource(資源):plist文件或者圖片之類.
Pch:文件放的是一些宏定義,一些接口之類
15 . CoreData:
Core Data是iOS5之后才出現的一個框架,它提供了對象-關系映射(ORM)的功能,即能夠將OC對象轉化成數據,保存在SQLite數據庫文件中,也能夠將保存在數據庫中的數據還原成OC對象。在此數據操作期間,我們不需要編寫任何SQL語句,
1.Core Data 是數據持久化存儲的最佳方式
2.數據最終的存儲類型可以是:SQLite數據庫,XML,二進制,內存里,或自定義數據類型
在Mac OS X 10.5Leopard及以后的版本中,開發者也可以通過繼承NSPersistentStore類以創建自定義的存儲格式
3.好處:能夠合理管理內存,避免使用sql的麻煩,高效
4.構成:
(1)NSManagedObjectContext(被管理的數據上下文)
操作實際內容(操作持久層)
作用:插入數據,查詢數據,刪除數據
(2)NSManagedObjectModel(被管理的數據模型)
數據庫所有表格或數據結構,包含各實體的定義信息
作用:添加實體的屬性,建立屬性之間的關系
操作方法:視圖編輯器,或代碼
(3)NSPersistentStoreCoordinator(持久化存儲助理)
相當于數據庫的連接器
作用:設置數據存儲的名字,位置,存儲方式,和存儲時機
(4)NSManagedObject(被管理的數據記錄)
相當于數據庫中的表格記錄
(5)NSFetchRequest(獲取數據的請求)
相當于查詢語句
(6)NSEntityDescription(實體結構)
相當于表格結構
16 .OC優缺點
優點:
1.Category是非常實用的擴展機制,可以很方便的為一個已有的類添加屬性或者方法,而不需要笨拙的去繼承。
2.運行時多態的概念,可以讓一個類的對象動態的以其他類行為去執行(OC中多了很多運行時態的機制,其中id的特殊用途,可以通過id類型的變量,調用不同類的同名函數,即使這些類沒有任何關系)。
3.ARC不用多講了吧
4.OC中成員變量也有三種訪問權限,@public,@protected,@private。但默認的是@protected,而C++中默認是private。
5.OC中成員函數只有兩種,一種是實例函數,一種是類函數。實例函數就是C++中的Public函數,類函數就是public中的static函數。
6.OC中成員函數如果要接受多個參數,則需要每個參數前加冒號.
7,OC還有protocol概念, 通過@protocol-@end來聲明protocol。類中通過<protocol1,protocol2,...>來表示支持某個協議。如@interface
A : Object < NSCopying, NSTransform >-@end表明類A繼承與Object類,并支持兩個協議(NSCopying, NSTransform )。
8.由于都是C衍生出的面向對象的語言
所以可以和C++混合編碼。(百度地圖API 就用到了)
缺點:
- 不支援命名空間
- 不支持運算符重載
- 不支持多重繼承
- 使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣
17 . socket連接和http連接的區別
18 .TCP的三次握手
19 去除刷新
[CATransaction setDisableActions:YES];
~
[CATransaction commit];