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