◆如何解決低內存問題?
編程
ForExample:將暫時沒有展現在Window中的界面銷燬,以得到足夠的內存;json
◆POST請求的數據類型有哪些?設計模式
json、xml、二進制、參數拼接;數組
◆請簡述你理解的面向對象思想。緩存
所謂面向對象,舉個最簡單的例子,就是這樣的。安全
A先生須要一臺電腦,可是A先生對電腦配置、性能、品牌等方方面面的知識一竅不通。而A先生恰巧有位經營電腦方面生意的朋友——C先生,C先生對電腦硬件方面非常瞭解。A先生告訴C先生所須要的電腦大概什麼需求、什麼價位。C先生就會提供給A先生其所需的電腦。至於中間篩選、購買、討價還價的過程什麼的,A先生徹底不用管任何一個環節。只須要付費,就能拿到所需的電腦。服務器
◆iOS中frame和bounds的區別?網絡
frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)多線程
bounds指的是:該view在自己座標系統中的位置和大小。(參照點是自己座標系統)架構
◆請簡述你理解的內存管理。
若是你經過分配和初始化(好比[[XXXClass alloc] init])的方式來建立對象,你就擁有這個對象,須要負責該對象的釋放。這個規則在使用NSObject的便利方法new時,也一樣適用。
若是你拷貝一個對象,你也擁有拷貝獲得的對象,須要負責該對象的釋放。
若是你保持一個對象,你就部分擁有這個對象,須要在之後都再也不使用的時候釋放該對象。
若是你從其餘對象那裏接收到一個對象,則你不擁有該對象,也不該該釋放它。
◆如何設計一個緩存類?
在程序中使用緩存能夠極大的提升程序的運行速度,設計一個簡單的緩存類並不須要太複雜的邏輯.
簡單的只須要3個接口.
1.存對象
2.取對象
3.刪除對象
讀取對象
·讀取對象的時候先讀內存
·內存沒有就讀文件
保存對象
·保存對象的時候前臺保存到內存裏
·後臺存入到文件裏
·內存空間不足就須要先釋放一塊內存
·收到內存不足的消息的時候刪除釋放全部的內存
◆iOS9.0都有哪些新特性?
1.網絡適配-Https
2.後臺定位
3.CoreSpotlightSearch
4.User-Interface-Testing用戶交互
5.UIStackView
6.Contacts-Framework獲取通信錄
7.白名單
8.多任務,iPad分屏
9.UIKit-Dynamics
10.MapKit
11.GameplayKit-Pathfinding
12.GameplayKit-Behaviors
13.CloudKit-Web-Service
◆什麼是懶加載?
懶加載就是懶漢模式,只有用到的時候纔回去初始化。也能夠理解爲延時加載。
舉個最簡單的例子:tableView中圖片的加載顯示。
一個延時加載,避免內存太高;一個異步加載,避免線程阻塞。
◆如何進行網絡消息推送?APNS推送(蘋果推送服務)的實現過程?APSN和第三方相比有何區別?
首先應用發送通知,系統彈出提示框詢問用戶是否容許,當用戶容許後向蘋果服務器(APNS)請求deviceToken,並由蘋果服務器發送給本身的應用,本身的應用將DeviceToken發送給本身的服務器,本身的服務器想要發送網絡推送時將deviceToken以及想要推送的信息發送給蘋果服務器,蘋果服務器將信息發送給應用。
推送信息內容,總容量不超過256個字節;
iOSSDK自己提供的APSN服務器推送,它能夠直接推送給目標用戶並根據您的方式彈出提示。
優勢:不論應用是否開啓,都會發送到手機端;
缺點:消息推送機制是蘋果服務器端控制,個別時候可能會有延遲,由於蘋果服務器也有隊列來處理全部的消息請求;
第三方推送機制,廣泛使用Socket機制來實現,幾乎能夠達到及時的發送到目標用戶手機端,適用於即時通信類應用。
優勢:實時的,取決於心跳包的節奏;
缺點:iOS系統的限制,應用不能長時間的後臺運行,因此應用關閉的狀況下這種推送機制不可用。
◆添加NSNotificationCenter監聽,其後面的object的意義是什麼?
用NSNotificationCenter添加監聽者,其後面的object的意義是:監聽同一條通知的多個觀察者,在通知到達時,它們執行回調的順序是不肯定的,因此咱們不能去假設操做的執行會按照添加觀察者的順序來執行。
◆論Socket和HTTP協議的區別。
HTTP協議是基於TCP鏈接的,是應用層協議,主要是解決如何包裝數據。
Socket是對TCP/IP協議的封裝,Socket自己並非協議,而是一個調用接口(API),經過Socket,咱們才能使用TCP/IP協議。
HTTP鏈接:短鏈接,客戶端向服務器發送一次請求,服務器響應後鏈接斷開,節省資源。服務器不能主動給客戶端響應(除非採用HTTP長鏈接技術),iPhone主要使用類NSURLConnection。
Socket鏈接:長鏈接,客戶端跟服務器端直接使用Socket進行鏈接,沒有規定鏈接後斷開,所以客戶端和服務器保持鏈接通道,雙方能夠主動發送數據,通常多用於遊戲。
Socket默認鏈接超時時間是30秒,默認大小是8K(理解爲一個數據包大小)。
◆iOS中數據的持久化存儲方式有哪些?
數據存儲的核心都是寫文件。
屬性列表:只有NSString、NSArray、NSDictionary、NSData可writeToFile,存儲依舊是plist文件。
Plis文件能夠存儲的7種數據類型:array、dictionary、string、bool、data、number。
對象序列化(對象歸檔):對象序列化經過序列化的形式,鍵值關係存儲到本地,轉化成二進制流。經過runtime實現自動歸檔/解檔。
1.編碼(對象序列化):把不能直接存儲到plist文件中的數據,轉化爲二進制數據NSData,能夠存儲到本地;
2.解碼(對象反序列化):把二進制數據轉化爲原本的類型。
◆什麼是KVC/KVO?它們之間有什麼關係?
數據存儲的核心都是寫文件。
kvc:鍵-值編碼,是一種間接訪問對象的屬性使用字符串來標識屬性,而不是經過調用存取方法,直接或經過實例變量訪問的機制。
不少狀況下能夠簡化程序代碼。Apple文檔其實給了一個很好的例子。
kvo:鍵值觀察機制,它提供了觀察某一屬性變化的方法,極大的簡化了代碼。
具體看到用到過的一個地方是對於按鈕點擊變化狀態的監控。
◆請簡述服務器鏈接三次握手。
第一次握手:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同事本身也發送一個SYN包,即SYN+ACK包,此時服務器進入SYN+RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次狀態。
◆層CALayer和UIView的區別是什麼?
二者最大的區別是:圖層不會直接渲染到屏幕上。UIView是iOS系統中界面元素的基礎,全部的界面元素都是繼承自它。它自己徹底是由CoreAnimation來實現的。它真正的繪圖部分,是由一個CALayer類來管理。UIView自己更像是一個CALayer的管理器。一個UIView上能夠有N個CALayer,每一個layer顯示一種東西,加強UIView的展示能力。
UIView能夠響應用戶事件,由於它繼承自UIResponder。
1.其實UIView之因此能顯示在屏幕上,徹底是由於它內部的一個圖層(即CALayer對象);
2.UIView自己不具有顯示功能,是它內部的層纔有顯示功能;
3.UIView建立對象時,UIVIew內部會自動建立一個圖層
(CALayer對象)經過UIVIew的layer屬性能夠訪問這個層。
4.當UIView須要顯示到屏幕上時:
4.1.會調用drawRect:方法進行繪圖,而且會將全部內容繪製在本身的圖層layer屬性上;
4.2.繪圖完畢後,系統會將圖層拷貝到屏幕上,因而完成了UIView的顯示。
◆nil、Nil、NULL區別是什麼?id和void *區別是什麼?
NULL:是對於C語言的指針而使用的,表示空指針;
nil:對於OC中的對象而使用的,表示對象爲空;
Nil:對於OC中的類而使用的,表示類指向空。
id:OC中指針,能夠指向全部類型的對象,它是泛型對象指針。
void*:C/C++中的泛型指針。
◆Objective-C使用什麼機制管理對象內存?
經過retainCount的機制來決定對象是否須要釋放。每次runloop的時候,都會檢查對象的retainCount,若是retainCount爲0,說明該對象沒有地方須要繼續使用了,能夠釋放掉了(會被系統自動釋放)。
◆ARC經過什麼方式幫助開發者管理內存?
編譯時根據代碼上下文,插入retain/release。
◆不手動指定autoreleasepool的前提下,一個autorelease對象在什麼時刻釋放?(好比在一個ViewController的viewDidload中建立)
分兩種狀況:手動干預釋放時機、系統自動去釋放。
1.手動勇於釋放時機——指定autoreleasepool就是所謂的:當前做用於大括號結束時釋放。
2.系統自動去釋放——不手動指定autoreleasepool
Autorelease對象會在當前的runloop迭代結束時釋放。
若是在一個ViewController的viewDidload中建立一個Autorelease對象,那麼該對象會在viewDidAppear方法執行前就被銷燬了。
◆lldb(gdb)經常使用的調試命令?
·breakpoint設置斷點定位到某一個函數
·n斷點指針下一步
·po打印對象
◆InterfaceBuilder中UserDefinedRuntimeAttributes如何使用?
它可以經過kvc的方式配置一些你在interfacebuilder中不能配置的屬性。當你但願在InterfaceBuilder中作儘量多的事情,這個特性可以幫助你編寫更加輕量級的viewController。
◆這段代碼有問題嗎?如何修改?
for (int i = 0; i < 10000; ++i) {
NSString *str = @"Abc";
str = [str lowercaseString];
str = [str stringByAppendingString:@"xyz"];
NSLog(@"%@", str);
}
從語法上看,沒有任何問題。
可是,確實存在問題。這裏考量的是iOS的自動釋放池的原理或者說內存管理。
實際,這段代碼的問題就是:內存得不到及時的釋放。
爲何得不到及時地釋放?
由於RunLoop是每一個事件循環結束後纔會自動釋放池去使對象的引用計數減一,對於引用計數爲零的對象纔會真正被銷燬、回收內存。
所以,對於此處的問題。一個for循環執行10000次,會產生10000個臨時自動番話對象,一直放到自動釋放池中管理,內存得不到回收。
而後,現象是:內存暴漲。
正確的寫法是:
for (int i = 0; i < 10000; ++i) {
@autoreleasepool {
NSString *str = @"Abc";
str = [str lowercaseString];
str = [str stringByAppendingString:@"xyz"];
NSLog(@"%@", str);
}
}
◆UITableview是如何重用cell的?
UITableview提供了一個屬性:visibleCells,它是記錄但潛在屏幕課件的cell,要想重用cell,咱們須要明確指定重用標識(identifier)。
當cell滾動出TableView可視範圍以外時,就會被放到可重用數組中。當有一個cell滾動出TableView可視範圍以外時,一樣也會有新的cell要顯示到TableView可視區,所以這個新小時出來的cell就會先從可重用數組中經過所指定的identifier來獲取,若是可以獲取到,則直接使用之,不然建立一個新的cell。
◆如何更高效地顯示列表?
要更高效地顯示列表(不考慮種種優化),能夠經過如下方法處理(只是部分):
·提早根據數據計算好高度並緩存起來;
·提早將數據處理、I/O計算異步處理好,並保存結果,在須要時直接拿來使用。
◆http狀態碼查詢
2XX成功狀態碼
200OK服務器成功處理了請求(這個是咱們見到最多的)
4XX客戶端錯誤狀態碼
400BadRequest(壞請求) 告訴客戶端,它發送了一個錯誤的請求
403 Forbidden(禁止)請求被服務器拒絕了
404 NotFound(未找到)未找到資源
408 RequestTimeout(請求超時)若是客戶端完成請求時花費的時間太長,服務器能夠回送這個狀態碼並關閉鏈接
414 RequestURLTooLong(請求URL太長) 客戶端發送的請求所攜帶的URL超過了服務器可以或者但願處理的長度
5XX服務器錯誤狀態碼
500 InternetSeverError(內部服務器錯誤)服務器遇到一個錯誤,使其沒法爲請求提供服務
501Not Implement(未實現) 客戶端發起的請求超出服務的能力範圍(好比,使用了服務器不支持的請求方法)時,使用此狀態碼
502 BadGateway(網關故障)代理使用的服務器遇到了上游的無效響應
503 ServiceUnavailable(未提供此服務)服務器目前沒法爲請求提供服務,但過一段時間就能夠恢復服務
504GatewayTimeout(網關超時)與狀態碼408相似,可是響應來自網關或代理,此網關或代理在等待另外一臺服務器的響應時出現了超時服務器
505 HTTPVersionNotSupported(不支持的HTTP版本)服務器收到的請求使用了它不支持的HTTP協議版本。有些服務器不支持HTTP早期的HTTP協議版本,也不支持過高的協議版本
◆單例模式的理解
單例模式是一種經常使用設計模式,單例模式是一個類在系統中只有一個實例對象。經過全局的一個入口點對這個實例對象進行訪問;
iOS中單例模式的實現方式通常分爲兩種:非ARC和ARC+GCD。
◆如何理解MVVM設計模式
ViewModel層,就是View和Model層的粘合劑,它是一個放置用戶輸入驗證邏輯,視圖顯示邏輯,發起網絡請求和其餘各類各樣的代碼的記號的地方。說白了,就是把原來ViewController層的業務邏輯和頁面邏輯等剝離出來放到ViewModel層。
View層,就是ViewController,它的任務就是從ViewModel層獲取數據,而後顯示。
◆關於Bitcode
問題描述:iOS新建項目默認須要支持bitcode,而不支持bitcode的SDK會致使沒法編譯運行。大部分社交平臺SDK不支持bitcode。
解決方案:
一、暫時關閉對bitcode的支持(建議),方法:選中工程文件-->選中project下的工程名-->Build Settings-->找到BuildOptions-->Enable Bitcode-->置爲NO,便可。
二、移除不支持bitcode的平臺SDK。
33.Objective-C中是否支持垃圾回收機制?
Objective-C是支持垃圾回收機制的(Garbagecollection簡稱GC),可是apple得移動終端中,是不支持GC的,Mac桌面系統開發中是支持的。
移動終端開發是支持ARC(AutomaticReferenceCounting的簡稱),ARC在iOS5以後推出的新技術,它與GC的機制是不一樣的。咱們在編寫代碼時,不須要向對象發送release或者autorelease方法,也不能夠調用delloc方法,編譯器會在合適的位置自動給用戶生成release消息(autorelease),ARC的特色是自動引用計數簡化了內存管理的難度。
◆對於RunLoop的理解
Runloop,是多線程的法寶,即一個線程一次只能執行一個任務,執行完任務後就會退出線程。主線程執行完即時任務時會繼續等待接收事件而不退出。非主線程一般來講就是爲了執行某一任務的,執行完畢就須要歸還資源,所以默認是不運行Runloop的;
每個線程都有其對應的Runloop,只是默認只有主線程的Runloop是啓動的,其餘子線程的Runloop默認是不啓動的,若要啓動則須要手動啓動;
在一個單獨的線程中,若是須要在處理完某個任務後不退出,繼續等待接收事件,則須要啓用Runloop;
NSRunloop提供了一個添加NSTimer的方法,能夠指定Mode,若是要讓任何狀況下都回調,則須要設置Mode爲Common模式;
實質上,對於子線程的Runloop默認是不存在的,由於蘋果採用了懶加載的方式。若是咱們沒有手動調用[NSRunloopcurrentRunloop]的話,就不會去查詢是否在當前線程的Runloop,也就不回去加載,更不會建立。
◆什麼是安全釋放?
先釋放再置空。
◆GCD內部怎麼實現的?
1.iOS和OSX的核心是XNU內核,GCD是基於XNU內核實現的
2.GCD的API所有在libdispatch庫中
3.GCD的底層實現主要有DispatchQueue和DispatchSource
DispatchQueue:管理block(操做)
DispatchSource:處理事件
◆KVO內部實現原理?
1.KVO是基於runtime機制實現的;
2.當某個類的對象第一次被觀察時,系統就會在運行期動態的建立該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter方法。派生類在被重寫setter方法中實現了真正的通知機制。(Person-->NSKVONotificationPerson)
◆iOS應用的調試技巧?
1.如遇到crash,分析崩潰日誌(symbolicatedrash工具的適用)保留崩潰版本的.dSYM文件;
2.在Xcode中進入斷點管理窗口,而後點擊右下方的+,增長新的ExceptionBreakpoint;
3.如遇到EXC_BAD_ACCESS,打開Scheme選項選擇EditScheme。而後勾上EnableZombie和MallocStack那兩項;
4.有效的日誌管理。NSLog和加入一些開源的日誌管理框架;
5.程序斷點debug模式。
◆iOS應用程序性能的調優
1.用ARC去管理內存;
2.適當的地方使用reuseIdentifier;
3.儘量設置視圖爲不透明;
4.避免臃腫的Xibs文件;
5.不要阻塞主線程;
6.調整圖像視圖中的圖像尺寸;
7.選擇正確合集;
8.啓用Gzip壓縮;
9.重用和延遲加載視圖;
10.使用緩存;
11.考慮使用繪圖;
12.處理內存警告;
13.重(chong)用大開銷對象;
14.使用SpriteSheets(sprite sheet主要是由N個圖像組合成的一個大的圖像,這個大的圖像裏面包括了一個完整動畫的全部幀,使用一個大圖片的好處就是減小讀取次數,在必定數量的狀況下,sprite sheet有很明顯的優點:
1.更小的文件尺寸
2.更快的打開速度
3.在FP11的時代能夠藉助STARTLING以便獲得GPU的加速支持
);
15.避免重複處理數據;
16.選擇正確的數據格式;
17.適當得設置背景圖片;
18.減小你的網絡佔用;
19.設置陰影路徑;
20.優化你的表格視圖;
21.選擇正確的數據存儲方式;
22.加速啓動時間;
23.使用自動釋放池;
24.緩存圖像;
25.儘量避免日期格式化。
◆UIScrollView的contentSize、contentOffSet和contentInset屬性的區別
contentSize表示UIScrollView滾動區域的大小。UIScrollView的frame屬性在設置好了之後不會隨內容的變化而變化;
contentOffSet表示是UIScrollView當前顯示區域定點相對於frame頂點的偏移量,通常用來設置UIScrollView顯示的位置;
contentInset表示是scrollView的contentView的頂點相對於scrollView的位置,假設你的contentInset=(0,100),那麼你的contentView就是從scrollView的(0,100)開始顯示。通常都是(0,0)表示從scrollView的開始顯示。
◆描述程序啓動的順序
1.main.m是程序的入口;
2.UIApplicationMain()建立應用程序對象,而且爲此對象指定委託,檢測程序的運行,同時開啓事件循環,處理程序接收到的事件;
3.UIApplicationDeletegate方法的執行;
4.加載window;
5.指定根視圖控制器;
6.在指定的視圖控制器中添加控件,實現應用程序界面;
◆介紹一下XMPP?有什麼優缺點嗎?
XMPP(Extensible Messaging and Presence Protocol,前稱)是一種以XML爲基礎的開放式實時通訊協議,是 經由互聯網工程工做小組(IETF)經過的互聯網標準。簡單的說,XMPP就是一種協議,一種規定。就是說,在網絡上傳 東西,要創建鏈接,TCP/IP鏈接,創建後再傳東西,而XMPP就是規定你傳的東西的格式。XMPP是基於XML的協議。 優勢開放:
XMPP協議是自由、開放、公開的,而且易於瞭解。 並且在客戶端 、 服務器 、 組件 、 源碼庫等方面,都已經各自有多種實現。 標準:
互聯網工程工做小組( IETF )已經將Jabber的核心XML流協議以XMPP之名,正式列爲承認的實時通訊及Presence技術。 而XMPP的技術規格已被定義在RFC 3920及RFC 3921 。 任何IM供應商在遵循XMPP協議下,均可與Google Talk實現鏈接。 證明可用:
第一個Jabber(如今XMPP)技術是Jeremie Miller在1998年開發的,如今已經至關穩定;數以百計的開發者爲XMPP技術而努 力。 今日的互聯網上有數以萬計的XMPP服務器運做着,並有數以百萬計的人們使用XMPP實時傳訊軟件。分散式:
XMPP網絡的架構和電子郵件十分相像;XMPP核心協議通訊方式是先建立一個stream,XMPP以TCP傳遞XML數據流,沒有 中央主服務器。 任何人均可以運行本身的XMPP服務器,使我的及組織可以掌控他們的實時傳訊體驗。安全:
任何XMPP協議的服務器能夠獨立於公衆XMPP網絡(例如在企業內部網絡中),而使用SASL及TLS等技術的可靠安全性,已自 帶於核心XMPP技術規格中。可擴展:
XML 命名空間的威力可以使任何人在覈心協議的基礎上建造定製化的功能;爲了維持通透性,常見的擴展由XMPP標準基金會 。 彈性佳:
XMPP除了可用在實時通訊的應用程序,還能用在網絡管理、內容供稿、協同工具、文件共享、遊戲、遠程系統監控等。 多樣性:
用XMPP協議來建造及佈署實時應用程序及服務的公司及開放源代碼計劃分佈在各類領域;用XMPP技術開發軟件,資源及支持的 來源是多樣的,使得使你不會陷於被「綁架」的困境。缺點數據負載過重:
隨着一般超過70%的XMPP協議的服務器的數據流量的存在和近60%的被重複轉發,XMPP協議目前擁有一個大型架空中存在的 數據提供給多個收件人。 新的議定書正在研究,以減輕這一問題。沒有二進制數據:XMPP協議的方式被編碼爲一個單一的長的XML文件,所以沒法提供修改二進制數據。 所以, 文件傳輸協議同樣使用外部的 HTTP。 若是不可避免,XMPP協議還提供了帶編碼的文件傳輸的全部數據使用的Base64 。 至於其餘二進制數據加密會話 (encrypted conversations)或圖形圖標(graphic icons)以嵌入式使用相同的方法。
◆isKindOfClass和isMemberOfClass的聯繫與區別
聯繫:二者都能檢測一個對象是不是某個類的成員
區別:isKindOfClass不只用來肯定一個對象是不是一個類的成員,也能夠用來肯定一個對象是否派生自該類的類的成員,而isMemberOfClass只能作到第一點
舉例:如ClassA派生自NSObject類,ClassA*a= [[ClassA alloc] init];,[a isKindOfClass:[NSObject class]]能夠檢查出a是不是NSObject類派生類的成員,但isMemberOfClass作不到。
◆isKindOfClass、isMemberOfClass、selector做用分別是什麼?
isKindOfClass:某個對象屬於某個類型,包括繼承的類型;
isMemberOfClass:某個對象確切屬於某個類型,是否是具體的實例;
selector:經過方法名,獲取在內存中的函數的入口地址;
◆寫一個便利構造器
//id表明任意類型指針,這裏表明Student *,類方法
+(id)studentWithName:(NSString *)newName andAge:(int)newAge
{
Student *stu=[[Student alloc]initName:newName andAge:newAge];
return [stu autorelease];//自動釋放
}
◆列舉集中進程的同步機制,並比較其優缺點
原子操做信號量機制;
自旋鎖;
管程;
會合;
分佈式系統;
◆進程之間通訊的途徑
共享存儲系統消息傳遞系統管道:以文件系統爲基礎;
◆進程死鎖的緣由
資源競爭及進程推動順序非法;
◆死鎖的4個必要條件
互斥;
請求保持;
不可剝奪;
環路;
◆死鎖的處理
鴕鳥策略;
預防策略;
避免策略;
檢測與接觸死鎖;
◆使用block時什麼狀況會發生引用循環,如何解決?
一個對象中強引用了block,在block中又強引用了該對象,就會發生循環引用;
解決方法是將該對象使用__weak或者__block修飾符修飾以後,再在block中使用;
1.id weak weakSelf = self;
或者weak__typeof(&*self)weakSelf = self該方法能夠設置宏;
2.id __block weakSelf = self;
或者將一種以防強制制空xxx = nil;
檢測代碼中是否存在循環引用問題,可以使用Facebook開源的一個檢測工具FBRetainCycleDetector;
◆一個Objective-C對象的isa的指針指向什麼?有什麼做用?
指向他的類對象,從而能夠找到對象上的方法;
◆Objective-C中的類方法和實例方法有什麼本質區別和聯繫?
類方法:
1.類方法是屬於類對象的;
2.類方法只能經過類對象調用;
3.類方法中的self是類對象;
4.類方法能夠調用其餘的類方法;
5.類方法中不能訪問成員變量;
6.類方法中不能直接調用對象方法;
實例方法:
1.實例方法是屬於實例對象的;
2.實例方法只能經過實例對象調用;
3.實例方法中的self是實例對象;
4.實例方法中能夠訪問成員變量;
5.實例方法中直接點用實例方法;
6.實例方法中也能夠調用類方法(經過類名);
◆KVO、NSNotification、delegate及block區別?
KVO就是cocoa框架實現的觀察者模式,通常同KVC搭配使用,經過KVO能夠監測一個值的變化,好比View的高度變化。是一對多的關係,一個值的變化會通知全部的觀察者。
NSNotification是通知,也是一對多的使用場景。在某些狀況下,KVO和NSNotification是同樣的,都是狀態變化以後告知對方。NSNotification的特色,就是須要被觀察者先主動發出通知,而後觀察者註冊監聽後再來進行響應,比KVO多了發送通知的一步,可是其優勢是監聽不侷限於屬性的變化,還能夠對多種多樣的狀態變化進行監聽,監聽範圍廣,使用也更靈活。
delegate 是代理,就是我不想作的事情交給別人作。好比狗須要吃飯,就經過delegate通知主人,主人就會給他作飯、盛飯、倒水,這些操做,這些狗都不須要關心,只須要調用delegate(代理人)就能夠了,由其餘類完成所須要的操做。因此delegate是一對一關係。
block是delegate的另外一種形式,是函數式編程的一種形式。使用場景跟delegate同樣,相比delegate更靈活,並且代理的實現更直觀。
KVO通常的使用場景是數據,需求是數據變化,好比股票價格變化,咱們通常使用KVO(觀察者模式)。
delegate通常的使用場景是行爲,需求是須要別人幫我作一件事情,好比買賣股票,咱們通常使用delegate。
Notification通常是進行全局通知,好比利好消息一出,通知你們去買入。
delegate是強關聯,就是委託和代理雙方互相知道,你委託別人買股票你就須要知道經紀人,經紀人也不要知道本身的顧客。
Notification是弱關聯,利好消息發出,你不須要知道是誰發的也能夠作出相應的反應,同理發消息的人也不須要知道接收的人也能夠正常發出消息。