標籤:
Qt/C++開發人員眼中的Obj-C
對於我們第一次自己定義iOS應用來說,對於來自Qt/C++開發人員來說,我不得不學習Objective-C相關文法與知識
為了讓讀者可以更easy理解這篇部落格的內容,我將描寫敘述諸多我所學到的東西.這將很多其它的是大腦轉存而不是單一的教程
,所以我仍然希望這將對你非常有協助,我將首先寫程式設計語言的差異,然後再寫關於類庫的差異
1.Objective C vs C vs C++
類似於C++,Obj-c是C語言的一個超集(這不是100%正確的,可是一個足夠好的語句來理解它),您將使用的副檔名的頭.h和.m來表示Obj-C文法
注意還有obj- c++副檔名.mm,儘管我如今還不會寫.
類似於塞班c++,Obj-C是使用兩個階段進行構造:首先你在堆上指派至,然後調用init方法.
通常能夠避免調用兩個方法和僅僅使用一個靜態簡便的方法,直接給你一個新分配的對象(比如stringWithCString).
全然不同(起初很分散)是Obj-C函數的調用方法,類似通常的C-ish方式,比如NSLog(@“我的日誌訊息”);但也有Obj-C文法對象的調用方法。
作為一個範例,這是對象有一個方法包括兩個參數:obj(obj methodName:param1value param2:param2Value]。看起來非常奇怪甚至彆扭,但你要去適應它。
在Objective C,這是通常被稱為發送訊息,不不過它的調用方法,還有好多我發現更加混亂.
在上面這種方法示範範例,methodName是所謂的選取器。一個選取器是一個方法的標識符。有時你必須識別方法(類似於一個函數指標),
在上面的範例中你能夠這樣寫@selector(methodName:param2:).
在c++中沒有根對象和Qt QObject僅用於一些對象,Objective C有強制性的根對象NSObject .
相反Qt你想訊號/插槽,你僅僅用QObject類,而Obj-c這裡你用NSObject做不論什麼事情.
自從iOS 5 實現ARC(自己主動引用計數),覺得它像一個隱式QSharedPointer在你的對象。編碼過程感覺到你有一個垃圾收集器。在內部,ARC告訴編譯器插入保留(添加引用計數)和釋放(減量引用計數和終於銷毀)語句在您的代碼中。
我覺得這是非常棒的,假設你堅持正常的做事的方式你基本上能夠不再再操心記憶體流失.
Objective C屬性類似於Qt中的Q_PROPERTY,這意味著您能夠使用好obj.var = foo文法在代碼內部(obj setVar:foo)訊息稱為(好吧. .訊息發送)。您能夠建立一個屬性@property和編譯器使用@synthesize為你做一個getter / setter。
當然也能夠定製getter / setter實現很多其它的內部邏輯,比如實現延遲初始化。
你能想象Objective C託付作為一組插槽。託付對象的一個託付方法被對象調用通知某些事情已經發生。這很類似於Java的介面
2.與Qt相關類相類似的東西
與文法一樣重要是相關的庫所提供的iOS(和OS X)。請繼續閱讀,瞭解他們提供的對象和功能。
NSString對象是一個常量字串。您還能夠建立通過@“followed by me”。
有一個可變的字串,必須使用NSMutableString配合其appendString,appendFormat等功能。尤其是appendFormat真的非常實用。
假設你想做替換,stringByReplacingOccurrencesOfString是你的朋友,給你一個新的NSString對象。若是構建檔案系統的路徑,您能夠使用stringByAppendingPathComponent。
像在c++中,基本類型像int不是對象。假設你須要封裝在一個對象,您能夠使用NSNumber和NSValue ,QVariant(類似)。
據我所知:您能夠使用intValue NSNumber或者NSString方法等轉換為int類型。
NSArray、NSSet NSDictionary他們聽起來像:一個容器來儲存NSObjects。NSArray相當於QList,NSSet等於 QSet,還有NSDictionary 類似於QHash / QMap。
您須要使用他們可變泛型改變他們(比如NSMutableArray)。
假設你想儲存原始類型,您須要使用NSNumber、NSValue等封裝。對於NSArray,您能夠通過使用objectAtIndex訪問對象。
NSDictionary,你使用valueForKey或objectForKey。
我沒有做太多的關於檔案IO方面的,所以我不能過多的寫。有NSFileManager檔案夾操作。你能夠非常easy地讀(小)檔案通過NSString stringWithContentsOfFile或NSData dataWithContentsOfFile。
記得在OS X和iOS系統都是基於POSIX標準,因此你也能夠使用系統的方法得到原始效能或者效率更高。
談到NSData:這是相當於Qt中QByteArray,可變的泛型,能夠看看NSMutableData。
你能夠通過資料或訪問mutableData方法得到char *指標。
我認為如今的大多數行動裝置 App程式使用HTTP。在Qt您將使用QNetworkAccessManager。在Objective C,你使用一個NSMutableURLRequest NSURLConnection內(或NSURLRequest)。您須要設定NSURLConnection託付。
託付處理非同步事件時產生下載(readyRead訊號串連:didReceiveData:完畢訊號connectionDidFinishLoading:等)。
假設你想做基於通訊端的IO,我僅僅能推薦GCDAsyncSocket。我曾經嘗試通訊端編程iQuassel項目有幾個原因,主要由於你必須使用Carbon取代Cocoa。GCDAsyncSocket也有不錯的優勢,您能夠非常easy地在一個線程中進行網路通訊協定解析,避免堵塞UI線程。
談到線程:你能夠通過使用NSObject 的performSelectorInBackground實現主要的並發性。它使一個方法在後台線程中執行。它能夠通過performSelectorOnMainThread傳達其結果到主線程。
假設你想做一個Qt-tish 0計時器調用,檢查afterDelay: performSelector變異,選取器執行在一個事件迴圈調用。
很多其它進階先進的東西能夠用NSOperationQueue或中央CPU調度。
NSRunLoop相當於Qt中的QEventLoop 。
假設你在還有一個線程處理事情和須要一個事件迴圈,比如網路IO。
那您能夠使用它來處理。
NSUserDefaults是一個非常好的方式來儲存和載入應用程式設定(與QSettings相類似)。
不幸的是Obj-c沒有類似于于QtXmlPatterns的相關對象。libxml2存在在iOS裝置上,因此您能夠使用。
對於簡單的sax風格的解析,至少有NSXMLParser能夠對付。
3.UI Things
XCode有視覺設計師(包括介面構建器),設計師能夠設計一個故事板(UIStoryboard)包括大量的視圖控制器(UIViewController子類)。
每一個視圖控制器管理檢視(還記得MVC嗎?)。導航視圖之間通過演變(UIStoryboardSegue)發生。
您能夠通過源視圖控制器的prepareForSegue方法在視圖控制器之間移動資料。在得到由OS特定事件發生時調用每一個視圖控制器類似viewWillAppear等方法。
您使用“outlets”連結與他們的同一在介面構建器UI檔案裡控制項的執行個體(比如UIButton、UILabel),用CTRL按鍵組合進行拖拽.
Qt的諸多視圖和控制項,我不做太多與之相應的Obj—C方面的控制項的比較。這裡就看看UITableView的內容包含使用你的UITableViewDataSource 和UITableViewDelegate。
我想說的差點兒全部的iOS應用程式都會使用表視圖。
假設你已經使用過QWebView,換成UIWebView也是一樣.
QImage和QPixmap 等同於CGDataProviderRef,NSImage和CGImage.
你能夠使用核心圖形的方法自己定義畫圖。UIGraphicsBeginImageContextWithOptions建立一個上下文,您能夠使用畫圖功能。假設你想獲得位元影像的上下文,嘗試UIGraphicsGetImageFromCurrentImageContext。
QRect,QPoint是CGRect等價物,CGPoint CGSize。
有助於你調試,檢查NSStringFromCGRect和它的朋友們。
對於小組件,注意NS * UI類相應於OS X和UI *類相應於iOS.
4. Misc
當我開發Qt,我使用QtCreator,我的聯合創始人奧利弗是KDevelop的粉絲,他也應該非常喜歡QtCreator,對於iOS開發,您能夠使用蘋果免費的XCode開發工具。
蘋果的project師還為您提供一些單元測試類似於Qt的QTest。在XCode,建立一個新的測試類和用法比如:STAssertEquals STAssertTrue等等.
5.Want to know more?
我猜想 Qt的開發人員論壇網站(http://qt-project.org/forums/)就相當於StackOverflow,iOS編程大多數問題在StackOverflow都能夠找到答案和協助。另一個內部蘋果開發人員論壇(https://idmsa.apple.com/IDMSWebAuth/login?appIdKey=4a75046cda87eab6386a9eae8caabb9824e328b9abc988119b39296495ec184c&path=/login.jspa)。
當然,假設你Qt應用到iOS不管需要協助 . 這是Woboq你可以做一件事!麻煩給我們寫信.
Objective C (iOS) for Qt C++ Developers(iOS開發,Qt開發人員需要瞭解什嗎?)