隨著iOS平臺開發的職位的增加,筆試、
面試也越來越有“套路”,這里我總結了一些面試題,多數是Objective-C的基礎知識,適合于面試新人,答案是我自己答的,不準確的地方,歡迎指出。
1. Object-c的類可以多重繼承么?可以實現多個接口么?Category是什么?重寫一個類的方式用繼承好還是分類好?為什么?
Object-c的類不可以多重繼承;可以實現多個接口,通過實現多個接口可以完成C++的多重繼承;Category是類別,一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關系。
2.#import 跟#include 又什么區別,@class呢, #import<> 跟 #import”"又什么區別?
#import 是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字,使用#import頭文件會自動只導入一次,不會重復導 入,相當于#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,才去查看類的實現文件,可以解決頭文件的相互包含;#import<>用來包含系 統的頭文件,#import””用來包含用戶頭文件。
3. 屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那種情況下用?
readwrite 是可讀可寫特性;需要生成getter方法和setter方法時
readonly 是只讀特性 只會生成getter方法 不會生成setter方法 ;不希望屬性在類外改變
assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;
retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;
copy 表示賦值特性,setter方法將傳入對象復制一份;需要完全一份新的變量時。
nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,一般使用nonatomic
4.寫一個setter方法用于完成@property (nonatomic,retain)NSString *name,寫一個setter方法用于完成@property(nonatomic,copy)NSString *name
- (void) setName:(NSString*) str { [str retain]; [name release]; name = str; } - (void)setName:(NSString *)str { id t = [str copy]; [name release]; name = t; } |
5.對于語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什么類型的對象?
編譯時是NSString的類型;運行時是NSData類型的對象
6.常見的object-c的數據類型有那些, 和C的基本數據類型有什么區別?如:NSInteger和int
object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,創建后便是對象,而C語言的基本數據類型int,只是一定字節的內存空間,用于存放數值;NSInteger是基本數據類型,并不是NSNumber的子類,當然也不是NSObject的子類。NSInteger是基本數據類型Int或者Long的別名(NSInteger的定義typedef long NSInteger),它的區別在于,NSInteger會根據系統是32位還是64位來決定是本身是int還是Long。
7.id 聲明的對象有什么特性?
Id 聲明的對象具有運行時的特性,即可以指向任意類型的objcetive-c的對象;
8.Objective-C如何對內存管理的,說說你的看法和解決方法?
Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。
9.內存管理的幾條原則時什么?按照默認法則.那些關鍵字生成的對象
需要手動釋放?在和property結合的時候怎樣有效的避免內存泄露?
誰申請,誰釋放
遵循Cocoa Touch的使用原則;
內存管理主要要避免“過早釋放”和“內存泄漏”,對于“過早釋放”需要注意@property設置特性時,一定要用對特性關鍵字,對于“內存泄漏”,一定要申請了要負責釋放,要細心。
關鍵字alloc 或new 生成的對象需要手動釋放;
設置正確的property屬性,對于retain需要在合適的地方釋放,
10.如何對iOS設備進行性能測試?
Profile-> Instruments ->Time Profiler
11.看下面的程序,第一個NSLog會輸出什么?這時str的retainCount是多少?第二個和第三個呢? 為什么?
======================================================= NSMutableArray* ary = [[NSMutableArray array] retain]; NSString *str = [NSString stringWithFormat:@"test"]; [strretain]; [aryaddObject:str]; NSLog(@"%@%d",str,[str retainCount]); [strretain]; [strrelease]; [strrelease]; NSLog(@"%@%d",str,[str retainCount]); [aryremoveAllObjects]; NSLog(@"%@%d",str,[str retainCount]); ======================================================= |
從今年過完春節過來后,公司的產品步驟從C/S轉變為B/S,之前B/S的
測試經驗較少,而且產品調整比較快,一下子沒有反應過來測試上應該做的調整。
根據項目的推進,對
web測試上可測試點進行匯總,老生常談的問題,但是還是想自己總結下:
1.功能測試:毋庸置疑,這是測試的根本。
2.瀏覽器兼容測試:可根據產品使用者的習慣以及目前市場上瀏覽器的排行榜進行瀏覽器種類測試的選擇。
3.網址測試:對此項測試印象很深刻,但是我發現好多人根據不在乎此測試,或者是根據覺得不應該測試,如果有這種觀點的應該及時改正,哈哈。網址也是咱們開發出來的嘛!
4.UI界面友好性測試:俗話說第一印象很重要,如果沒有漂亮的界面,好多用戶是懶的看的,好的界面既要符合公司的發展,也要符合用戶的眼光,很是佩服UI設計人員。
5.數據庫測試:聲明,這里說的不是對
數據庫進行的壓力測試,而是數據連接測試,如果數據存儲出問題了,那可不是小事兒。其實之前做c/s的時候沒有什么感覺,也是這次的項目給我很深刻的印象。
6.連接測試:產品中含有死鏈、壞鏈等無效的鏈接地址,是要給頁面的響應速度增加負擔的,這方面其實還是要注意下。xenu目前用的是這個小工具。
7.單個頁面響應速度:明確了單個的頁面響應速度也同樣能知道那種元素對頁面的影響最大。目前使用工具為httpWatch。發現此工具的作用還是蠻多的,應該好好研究下。
8.自動化測試:穩定的產品比較適用,對測試人員的技術要求也比較高,目前的工具也比較多開源的破解的嘿嘿。正在
學習中;但是有一點很重要不是所有的功能都適用于自動化,所以設計上還是要思考清楚。
9.性能測試:壓力測試、負載測試、效率測試等等
以上是接觸B/S后的感受,再次記錄一下,時間長些后會有些補充,沒有什么邏輯,
隨筆而已,其實什么也不是那么容易可以搞定的,安靜下來,多用用心,多用用腦,我相信我可以。
為增強自信心而寫代碼
關于
單元測試,其作用我認為更多的是增強開發者的信心,以及作為代碼的執行文檔(額外的效果)。也就是說,編寫單元測試首先是開發者的責任,其次單元測試的粒度由程序員的自信心決定。
"老板為我的代碼付報酬,而不是測試,所以,我對此的價值觀是——測試越少越好,少到你對你的代碼質量達到了某種自信(我覺得這種的自信標準應該要高于業內的標準,當然,這種自信也可能是種自大)。如果我的編碼生涯中不會犯這種典型的錯誤(如:在構造函數中設了個錯誤的值),那我就不會測試它。我傾向于去對那些有意義的錯誤做測試,所以,我對一些比較復雜的條件邏輯會異常地小心。當在一個團隊中,我會非常小心的測試那些會讓團隊容易出錯的代碼。"
--XP和TDD的創造者Kent Beck如是說。
由過去的經驗,我認同上述的觀點,并且認為不應該將單元測試作為銀彈。甚至項目經理應該忘記有單元測試這回事,干脆把那當做程序員的樂趣就好了,然后該有的測試流程和規范必須要求到。
不要違反原則
單元測試需遵守的關鍵原則是:
1、單元測試應該是可重復的
2、單元測試應該是獨立的
3、單元測試是快速執行的
以下為一個壞的例子。
部門的技術主管一直希望找到一種方法可以普遍提高開發人員的代碼水平,以及減少bug和改善設計,這恰恰是單元測試所擅長的。所以我們配合持續集成的實踐,在后來的項目中嚴格要求單元測試。
不得不說,在經過一段時間的抵觸后,大家還是非常喜歡的。因為我們的產品清單上有專門的單元測試時間,并且大家也開始嘗到甜頭--容易犯的小錯少了。
但是在我們還來不及歡呼的時候,問題出現了,而且很棘手。
我們的項目大都是關于數據存儲的,比如簡單的新增、復雜的查詢、顯示報表等等。而我們的單元測試其實就是冒煙測試,并且還是不合格的單元測試。原因是我們使用
數據庫的數據作為輸入,眾所周知,這些數據很容易被修改,故我們的單元測試是不可能具有可重復性。另外,我們的單元測試也不是獨立的,因為我們非常依賴數據存儲層。
從以上的描述,你可能猜到,沒錯,我們的開發人員大多都很初級,經常犯得錯誤就是關于sql的編寫,ibatis的使用語法之類的錯誤。也就是說他們最不自信的地方就是語法或者工具的使用。
讓單元測試變成可重復的相對簡單,使用dbunit之類的工具可以輕松的達到,即使這個工具有時也會出錯,比如oracle的Large Objec類型就會報錯。但是對數據存儲層的依賴就不能避免了,因為這恰恰是我們要測試的。而相比時間而言,前兩個因素又顯得不那么重要了。
在項目中,我們對每個dao層的方法都寫了單元測試,有的單元測試花費的時間甚至比寫代碼的時間要多。結果是我們的代碼確實是可用的,但是時間卻比想象的多得多。比如由A來編寫接口,然后由另外一個人B來編寫頁面,然后由B調用A的接口?;ㄙM的時間=編寫接口+編寫頁面+2*調用接口時間(這個名稱不怎么好,但是在海沒有發現合適的名稱時,還是讓我們暫時使用它吧)。調用接口時間是指兩個人座到一起,A告訴B如何調用他的接口的時間,加上剛好出了問題,A為了方便直接在B的電腦上修改花費的時間。這里的時間都是兩份的。
而我們的項目執行一次單元測試至少要10分鐘左右,而且還會報錯,因為不可重復性,有時它可以執行成功,有時它并不能。現在我們要花費的時間變成編寫接口+編寫頁面+2*調用接口的時間+n*10分鐘。
之前說了,我們要求單元測試時為了保證接口是可用的,單元測試并不是唯一的方式。假設我們啟動項目(5分鐘),點擊頁面進入頁面(每次0.5分鐘),然后出錯查看信息,解決問題(M分鐘)。相比之下,使用單元測試則是啟動10分鐘,出錯,設置打印信息,然后啟動(10分鐘),再設置打印信息。直至發飆。。。
現在,你應該知道我們的痛苦了。
從今年過完春節過來后,公司的產品步驟從C/S轉變為B/S,之前B/S的
測試經驗較少,而且產品調整比較快,一下子沒有反應過來測試上應該做的調整。
根據項目的推進,對
web測試上可測試點進行匯總,老生常談的問題,但是還是想自己總結下:
1.功能測試:毋庸置疑,這是測試的根本。
2.瀏覽器兼容測試:可根據產品使用者的習慣以及目前市場上瀏覽器的排行榜進行瀏覽器種類測試的選擇。
3.網址測試:對此項測試印象很深刻,但是我發現好多人根據不在乎此測試,或者是根據覺得不應該測試,如果有這種觀點的應該及時改正,哈哈。網址也是咱們開發出來的嘛!
4.UI界面友好性測試:俗話說第一印象很重要,如果沒有漂亮的界面,好多用戶是懶的看的,好的界面既要符合公司的發展,也要符合用戶的眼光,很是佩服UI設計人員。
5.數據庫測試:聲明,這里說的不是對
數據庫進行的壓力測試,而是數據連接測試,如果數據存儲出問題了,那可不是小事兒。其實之前做c/s的時候沒有什么感覺,也是這次的項目給我很深刻的印象。
6.連接測試:產品中含有死鏈、壞鏈等無效的鏈接地址,是要給頁面的響應速度增加負擔的,這方面其實還是要注意下。xenu目前用的是這個小工具。
7.單個頁面響應速度:明確了單個的頁面響應速度也同樣能知道那種元素對頁面的影響最大。目前使用工具為httpWatch。發現此工具的作用還是蠻多的,應該好好研究下。
8.自動化測試:穩定的產品比較適用,對測試人員的技術要求也比較高,目前的工具也比較多開源的破解的嘿嘿。正在
學習中;但是有一點很重要不是所有的功能都適用于自動化,所以設計上還是要思考清楚。
9.性能測試:壓力測試、負載測試、效率測試等等
以上是接觸B/S后的感受,再次記錄一下,時間長些后會有些補充,沒有什么邏輯,
隨筆而已,其實什么也不是那么容易可以搞定的,安靜下來,多用用心,多用用腦,我相信我可以。
最近幾年,
云計算非常受歡迎,而在這種環境的影響下,
軟件開發項目也變得非常流行。該技術未必適合每一個企業,但是,云計算并不是一時的流行而已。云計算的
軟件測試功能為項目開發帶了新的機遇,同時也帶來了新的挑戰。
云中軟件測試的風險與安全問題
如下列舉了一些在軟件測試過程中應用云工具最常問到的幾個問題。
云中測試和運行企業軟件會帶來哪些利益?
運用云工具,開發人員和測試人員可以擁有一些主動權。在內部測試以及其他環節上,他們擁有相同的基本功能。關鍵優勢是云中測試可以提供更好地可擴展性。
與傳統的云計算相比,擴展性可以讓不同類型的公司都可以處理大型項目,對于中小型企業來說,更能凸顯這種優勢。當接到一個額外的而又不得不處理的測試任務時,開發團隊可以運用現有的基礎框架應對這種額外的測試服務。這樣做可以為企業節省時間和節約資金,并將其投入到設備上,以及分配給短期的特殊項目。
除了可擴展性外,云基礎設施可以讓生產環境的測試和監控變得更加容易。應用程序可以檢測出實際用戶的數目。對于全球化應用程序來說,也應該進行充分的測試。當用戶正在使用一個應用程序時,國際化和本地化方法可以幫助企業探測出用戶的地理位置,并相應地調整用戶體驗。此外,實際生產環境中會出現一些潛在的問題和急需修正的情況,此時,云
功能測試可以向開發團隊提供豐富的知識以應對如上情況。
有了云工具,測試團隊再也不必等著IT才能開工。Rob Barry在一篇
文章中提到,用戶反映有了虛擬的實驗室后,解決問題的速度變得更快了。當質量保證專家們不再處理機器或者界面出現的IT問題時,他們也會放松放松。另外,IT可以節省更多的時間來處理一些潛在的卻更加重要的問題。
有哪些風險或者缺點?
云測試環境中在責任和能力方面會出現風險。當不再使用本地工具時,可能會出現一些失控的情況。擁有一種外部媒介可以減少開發中IT人員的
工作時間,但是,只有當供應商能夠迅速地解決出現的所有問題時,才會顯現出其有利的一面。如果所出現的問題得不到解決,IT人員也不會去援助,因為,他們手邊沒有可以使用的工具。
可擴展性除了是云基礎設施的一大優勢外,它還展示了一些未知之事。我們也許不知道一個指定項目的規模比重,這樣的話,云計算會引起高額的費用。沒有正式的審批程序而建立了新的虛擬機器可能會引起意想不到的費用,特別是如果自動化方法沒有縮減到應有的費用標準時,費用會更高。為了避免這些問題,測試團隊可以而且應該使用云服務,研究云供應商的政策中出現爭議的賬單。
另外,云計算還會面臨功能測試、數據管理、安全、個人隱私和可利用性等方面的挑戰。企業必須判斷出他們會面臨哪些風險。對于一些企業來說,云測試的財務成本可能過高。面對如上所有的風險時,最重要的是,企業要非常好地掌握云功能,并知道如何最優化使用云功能。
有哪些安全問題?
企業應用程序必須具備安全性,但是,由于處于這種特殊環境下,這些應用程序就必須經過測試環境,而且要依托于云計算。我們要了解云計算的缺陷以及如何應對這些缺陷。
決策者應該考慮云計算中哪些數據能夠被采用,特別是,當這些數據中包含用戶信息時就更要謹慎。無論公司針對于安全性采取了什么措施,安裝防火墻或者其他什么工具,我們都要解決安全隱患。
最近在研究
java代碼的生命周期。這其中遇到一個java代碼初始化的問題。
代碼如下:
public class JvmTest { private static int count1; private static int count2 = 0; private static JvmTest JvmTest =new JvmTest(); public JvmTest() { System.out.println("JvmTest"); count1++; count2++; } public static JvmTest getInstance() { return JvmTest; } public static void main(String[] args) { System.err.println("count1=" + JvmTest.count1); System.err.println("count2=" + JvmTest.count2); } } |
這段代碼運行之后的結果是什么呢?
如果你已經有答案了,請看下面這段代碼:
public class JvmTest { private static JvmTest JvmTest =new JvmTest(); private static int count1; private static int count2 = 0; public JvmTest() { System.out.println("JvmTest"); count1++; count2++; } public static JvmTest getInstance() { return JvmTest; } public static void main(String[] args) { System.err.println("count1=" + JvmTest.count1); System.err.println("count2=" + JvmTest.count2); } } |
這段運行結果又是什么呢?
我開始對運行結果也比較疑惑,然后仔細分析了一下,問題就出在java代碼的初始化上。因為這個
測試類是帶有main函數的,它會在程序運行時即執行。所以這屬于主動引用,這種情況會促使類的初始化。初始化過程中,在調用成員方法之前,它首先會按順序對靜態成員變量進行賦值,如果無值可賦就給一個默認值。說到這里我想上面兩段代碼的結果也就好解釋了。
第一段首先count1和count2值都是0,一個是類加載過程中默認的0,一個是賦值為0,然后執行了new操作,對count1和count2進行自加,所以到這里,count1和count2的值都是1.而第二段則是先new操作對count1和count2都自加,變成1,然后再對count2進行賦值操作,所以count2的值又從1改成了0.
遇到的問題如下:數據庫中存儲了IP地址,以及IP地址掩碼,需要將他們轉化成CIDR格式的,并且不僅僅是將掩碼轉化成CIDR對應的數字的問題,需要將原有的IP地址轉化成對應的網絡地址,例如IP地址是58.247.221.238,掩碼是255.255.255.252,需要將其轉化為58.247.221.236/30。
解決方案:我們知道,將IP地址和掩碼通過位與函數就能得到對應的網絡地址.Google一下,找到了將IPv4地址轉成數字以及轉化回來的函數。有了這兩個函數,再利用
Oracle 自帶的bitand函數,問題就解決了。可以先將IP地址和掩碼通過字符串轉IP的函數轉成數字,然后通過位與運算就能得到相應的網絡地址對應的數字,再通過數字轉字符串的功能,即得到對應的網絡地址。至于/后面CIDR的數字,可以通過導入一張掩碼和CIDR數字的對應表得到,不在詳述.
實際例子如下: 返回58.247.221.236
Sql代碼
select inttoip(BITAND(dottedQuadToNumber('58.247.221.238'),
ottedQuadToNumber('255.255.255.252'))) from dual
附: 將字符串轉成數字的函數:
Sql代碼
CREATE OR REPLACE function dottedQuadToNumber ( dottedQuad IN VARCHAR2) return number is Result NUMBER; begin Result:= (substr(dottedQuad , 1, (instr(dottedQuad , '.', 1, 1 ) - 1)) * 256 * 256 * 256 ) + (substr(dottedQuad , instr(dottedQuad , '.', 1, 1 ) + 1, instr(dottedQuad , '.', 1, 2 ) - instr(dottedQuad , '.', 1, 1 ) - 1) * 256 * 256 ) + (substr(dottedQuad , instr(dottedQuad , '.', 1, 2 ) + 1, instr(dottedQuad , '.', 1, 3 ) - instr(dottedQuad , '.', 1, 2 ) - 1) * 256 ) + (substr(dottedQuad , instr(dottedQuad , '.', 1, 3 ) + 1) ) ; return(Result ); end dottedQuadToNumber ; |
數字轉成ip地址的函數:
Sql代碼
CREATE OR REPLACE function inttoip(ip_address integer) return varchar2 deterministic is begin return to_char(mod(trunc(ip_address /256/ 256/256 ),256)) || '.'|| to_char(mod(trunc(ip_address/ 256/256 ),256)) || '.'|| to_char(mod(trunc(ip_address/ 256),256 )) || '.'|| to_char(mod(ip_address, 256)); end; |
1、調用 自帶mail
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@hzlzh.com"]];
2、調用 電話phone
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8008808888"]];
iOS應用內撥打電話結束后返回應用
一般在應用中撥打電話的方式是:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://123456789"]];
使用這種方式撥打電話時,當用戶結束通話后,
iphone界面會停留在電話界面。
用如下方式,可以使得用戶結束通話后自動返回到應用:
UIWebView*callWebview =[[UIWebView alloc] init];
NSURL *telURL =[NSURL URLWithString:@"tel:10086"];// 貌似tel:// 或者 tel: 都行
[callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];
//記得添加到view上
[self.view addSubview:callWebview];
還有一種私有方法:(可能不能通過審核)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://10086"]];
3、調用 SMS
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://800888"]];
4、調用自帶 瀏覽器 safari
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.hzlzh.com"]];
調用phone可以傳遞號碼,調用SMS 只能設定號碼,不能初始化SMS內容。
若需要傳遞內容可以做如下操作:
加入:MessageUI.framework
#import <MessageUI/MFMessageComposeViewController.h>
實現代理:MFMessageComposeViewControllerDelegate
調用sendSMS函數
//內容,收件人列表 - (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients { MFMessageComposeViewController *controller = [[[MFMessageComposeViewController alloc] init] autorelease]; if([MFMessageComposeViewController canSendText]) { controller.body = bodyOfMessage; controller.recipients = recipients; controller.messageComposeDelegate = self; [self presentModalViewController:controller animated:YES]; } } // 處理發送完的響應結果 - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result { [self dismissModalViewControllerAnimated:YES]; if (result == MessageComposeResultCancelled) NSLog(@"Message cancelled") else if (result == MessageComposeResultSent) NSLog(@"Message sent") else NSLog(@"Message failed") } |
默認發送短信的界面為英文的,解決辦法為:
在.xib 中的Localization添加一組chinese就ok了
PS:開始寫這個系列的筆記:主要是對過去自己比較模糊的一些概念進行
測試,明確結果,提高自己
IOS 應用如果占用系統的內容過大(8GB),就會造成應用直接被系統以崩潰的形式關閉,一次控制應用占用的內存大小是非常重要的事情。
現在我們來看看,一個空的應用占據的內容的大?。?/div>
測試環境:xCode 5.0/IOS 5
啟動一個空應用,占用的內存為 2.6MB,占據應用崩潰的閥值為 0.03%
1:關于導航條的 Push和popup的測試結果
[self.navigationController pushViewController:m_navanimated:YES];
[self.navigationController popViewControllerAnimated:YES];
對于
pushViewController ,會將對應的ViewController對象的引用計數器+1
popViewControllerAnimated 會將對應的ViewController對象的引用計數器-1
但是有一點需要明確的是,對于函數
-(void)dealloc
{
//Objects release here
[super deallco];
}
只有在該引用計數器的值==0的時候才會調用,這個是必須牢記的。
在執行函數[self.navigationController popViewControllerAnimated:YES];的時候,如果彈出的ViewController對應的引用計數器為0,那么也會執行dealloc 函數。
所以再使用
[self.navigationController pushViewController:m_navanimated:YES];
[self.navigationController popViewControllerAnimated:YES];
棧函數對的時候,為了釋放內存,我們可以這么使用
Nav_1 *m_nav = [[[Nav_1 alloc] initWithNibName:nil bundle:nil] autorelease];
[self.navigationController pushViewController:m_nav animated:YES];
這樣就最大限度的節省了寶貴的內存空間
有一段時間沒有認真總結和寫博客了
前段時間找
工作、進入工作階段。比較少靜下來認真總結,現在靜下心來總結一下最近的一些心得
前言
AsyncSocket詳解
AsyncSocket示例
一、前言
公司的項目用到了Socket編程,之前在
學習的過程當中,用到的更多的還是http請求的方式。但是既然用到了就必須學習一下,所以就在網上找一些例子,然后想自己寫一個demo??墒前l現很多寫iOS Socket的博客并沒有很詳細的說明,也可能是大神們覺得其他東西都淺顯易懂。
自己專研了一下,將自己的一些理解總結出來,一方面整理自己的學習思路,另一方面,為一些和我有同樣困惑的小伙伴們,稍做指引。
二、AsyncSocket介紹
1)iOS中Socket編程的方式有哪些?
?。瑽SD Socket
BSD Socket 是UNIX系統中通用的網絡接口,它不僅支持各種不同的網絡類型,而且也是一種內部進程之間的通信機制。而iOS系統其實本質就是UNIX,所以可以用,但是比較復雜。
?。瑿FSocket
CFSocket是
蘋果提供給我們的使用Socket的方式,但是用起來還是會不太順手。當然想使用的話,可以細細研究一下。
-AsyncSocket
這次博客的主講內容,也是我們在開發項目中經常會用到的。
2)為什么選擇AsyncSocket?
iphone的CFNetwork編程比較艱深。使用AsyncSocket開源庫來開發相對較簡單,幫助我們封裝了很多東西。
三、AsyncSocket詳解
1??說明
在我們開發當中,我們主要的任務是開發客戶端。所以詳解里主要將客戶端的整個連接建立過程,以及在說明時候回調哪些函數。在后面的示例代碼中,也會給出服務器端的簡單開發。
2??過程詳解
1.建立連接
- (int)connectServer:(NSString *)hostIP port:(int)hostPort
2.連接成功后,會回調的函數
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
3.發送數據
- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
4.接受數據
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
5.斷開連接
- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
- (void)onSocketDidDisconnect:(AsyncSocket *)sock
主要就是上述的幾個方法,只是說在真正開發當中,很可能我們在收發數據的時候,我們收發的數據并不僅僅是一個字符串包裝成NSData即可,我們很可能會發送結構體等類型,這個時候我們就需要和服務器端的人員協作來開發:定義怎樣的結構體。
主站蜘蛛池模板:
中卫市|
随州市|
水城县|
彭水|
淮安市|
保定市|
宜宾县|
民乐县|
新巴尔虎左旗|
阿巴嘎旗|
福建省|
嘉兴市|
讷河市|
德清县|
舟山市|
昌图县|
昂仁县|
老河口市|
越西县|
珠海市|
新丰县|
肥乡县|
开阳县|
上虞市|
万源市|
苏尼特右旗|
观塘区|
济宁市|
乐都县|
大名县|
清流县|
扶风县|
五家渠市|
永嘉县|
乐清市|
南靖县|
广元市|
元谋县|
沂水县|
洞头县|
大厂|