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 *指针。

    我认为如今的大多数移动应用程序使用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开发人员需要了解什么?)的更多相关文章

  1. QT Mobile: 一统IOS/Andriod/WP/等移动平台的江湖

    笔者在研究生阶段做了2年的QT开发,那时候QT在嵌入式的图形开发中非常火,当时Nokia在智能机的份额还是第一.想当年,Nokia从Trolltech的手中收购了QT,当时大家还在例会上讨论QT终于不 ...

  2. iOS 7 - Auto Layout on iOS Versions prior to 6.0

    链接地址:http://stackoverflow.com/questions/18735847/ios-7-auto-layout-on-ios-versions-prior-to-6-0 Stac ...

  3. iOS 9的新的改变 iOS SDK Release Notes for iOS 9 说了些改变

    iOS 9的新的改变 iOS SDK Release Notes for iOS 9 说了些改变   看了下还算能理解!!!有兴趣可以看看哈!!!不喜勿喷!!后面的对于废除的方法什么有用感觉!!!   ...

  4. XE7 & IOS开发之开发账号(3):证书、AppID、设备、授权profile的申请使用,附Debug真机调试、Ad hoc下iPA文件生成演示(XCode5或以上版本推荐,有图有真相)

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 注意,以下讨论都是以&q ...

  5. XE7 & IOS开发之开发账号(2):发布证书、发布授权profile的申请使用,附Ad hoc真机调试、生成ipa文件演示(XCode所有版本通用,有图有真相)

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 注意,以下讨论都是以&q ...

  6. XE7 & IOS开发之开发账号(1):开发证书、AppID、设备、开发授权profile的申请使用,附Debug真机调试演示(XCode所有版本通用,有图有真相)

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 注意,以下讨论都是以&q ...

  7. [Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考、NuGet组件参考

    [Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考.NuGet组件参考 解决方案 目前Visual Studio中最新版本的Xamarin.iO ...

  8. iOS 7 教程:定制iOS 7中的导航栏和状态栏

    目录(?)[-] iOS 7中默认的导航栏 设置导航栏的背景颜色 在导航栏中使用背景图片 定制返回按钮的颜 修改导航栏标题的字体 修改导航栏标题为图片 添加多个按钮 修改状态栏的风格 隐藏状态栏 总结 ...

  9. (转)iOS Wow体验 - 第二章 - iOS用户体验解析(1)

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第二章译文精选的第一部分,其余章节将陆续放出.上一 ...

随机推荐

  1. python web

    [root@xen202 wbk]# python -m SimpleHTTPServerServing HTTP on 0.0.0.0 port 8000 ...

  2. 忽然想到:把Mu的源代码一网打尽

    那么那些流媒体开发的公司,就不会拒绝我了,真是一举两得.

  3. li里的a标签浮动了,为什么li本身也浮动了?

    <ul> <li><a href="#"></a></li> <li><a href="#& ...

  4. 爬虫总结_python

    import sqlite3 Python 的一个非常大的优点是很容易写很容易跑起来,缺点就是很多不那么著名的(甚至一些著名的)程序和库都不像 C 和 C++ 那边那样专业.可靠(当然这也有动态类型 ...

  5. IBinder在进程之间传递一个对象的形式(一)

    主张 什么时候service通常被称为远程时的,用到aidl来定一个接口供service和client来使用,这个事实上就是使用Binder机制的IPC通信.当client bind service成 ...

  6. HDU 3571 N-dimensional Sphere(高斯消元 数论题)

    这道题算是比较综合的了,要用到扩展欧几里得,乘法二分,高斯消元. 看了题解才做出来orz 基本思路是这样,建一个n*(n-1)的行列式,然后高斯消元. 关键就是在建行列式时会暴long long,所以 ...

  7. 使用国内源解决Qt在线更新慢的问题

    Qt在线安装更新工具默认使用官方的源,国内访问比较慢,可以在setting中增加国内的源来提高更新速度,如下面的源: http://mirrors.ustc.edu.cn/qtproject/onli ...

  8. 安卓开发28:自定义View类

    自定义View类 通过自定义View类,可以自定义复杂的,按照自己需求的控件. 一个简单的例子 mainActivity.java 这个里面就是最普通的代码,但是给自定义的控件加上了一个onclick ...

  9. Managing Data in Containers

    Managing Data in Containers So far we've been introduced to some basic Docker concepts, seen how to ...

  10. spring-security3.2.5实现中国式安全管理(转)

    最近公司要做开发平台,对安全要求比较高:SPRING SECURTIY框架刚好对所有安全问题都有涉及,框架的作者最近还做了spring-session项目实现分布式会话管理,还有他的另一个开源项目sp ...