標籤:qt ios xcode ui 程式設計語言
Qt/C++開發人員眼中的Obj-C
對於我們第一次自訂iOS應用來說,對於來自Qt/C++開發人員來說,我不得不學習Objective-C相關文法與知識
為了讓讀者能夠更容易理解這篇部落格的內容,我將描述諸多我所學到的東西.這將更多的是大腦轉存而不是單一的教程
,所以我仍然希望這將對你很有協助,我將首先寫程式設計語言的差異,然後再寫關於類庫的差異
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目錄操作。你可以很容易地讀(小)檔案通過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也有不錯的優勢,您可以很容易地在一個線程中進行網路通訊協定解析,避免阻塞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開發工具。
蘋果的工程師還為您提供一些單元測試類似於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開發人員需要瞭解什嗎?)