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. git for windows (又名 msysgit)如何记住用户名和密码

    创建存储用户名密码的文件 在home文件夹,一般是 C:\Documents and Settings\Administrator 下建立文件 .git-credentials (windows下不允 ...

  2. 程序缩小到托盘后系统就无法关机(解决方案)——处理WM_QUERYENDSESSION消息,并把它标识为处理过了

    程序缩小到托盘后系统就无法关机(解决方案)                       老帅    程序最小化到托盘后,会出现系统无法关闭的问题,常见于WinXP系统中,这里提供一个解决方案!一.解决 ...

  3. HDU/HDOJ 2612 Find a way 双向BFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612 思路:从两个起点出发,有多个终点,求从两个起点同时能到达的终点具有的最小时间,开两个数组分别保存 ...

  4. 常见问题(FAQ) | VPNCUP

    常见问题(FAQ) | VPNCUP 常见问题(FAQ) 关于FAQ 新手开始 登录验证问题 为什么刚注册后,登录VPN服务器提示错误? 免费注册的用户有哪些限制? 为什么连接免费VPN后20分钟自动 ...

  5. iptables 小结

    最近工作上一个作业用到了iptables命令,主要进行端口映射,在网上查了好多资料,尽管有很多例子,但还是整了好几天才整明白.在这里将学习到的知识总结一下.以下均属个人见解.(有一些是从网络中总结的, ...

  6. 经常使用Firefox插件大全

    Web开发者经常使用的火狐插件 1)FireShot:是一个截图工具,来源于截图软件Screenshot Studio的开发商,是一个Firefox扩展或者说是Firefox版的Screenshot ...

  7. BZOJ 2809 APIO2012 dispatching Treap+启示式合并 / 可并堆

    题目大意:给定一棵树,选定一棵子树中的一些点,薪水和不能超过m,求点的数量*子树根节点的领导能力的最大值 考虑对于每一个节点,我们维护一种数据结构,在当中贪心寻找薪金小的雇佣. 每一个节点暴力重建一定 ...

  8. Nginx 负载均衡-加权轮询策略剖析

    本文介绍的是客户端请求在多个后端服务器之间的均衡,注意与客户端请求在多个nginx进程之间的均衡相区别(Nginx根据每个工作进程的当前压力调整它们获取监听套接口的几率,那些当前比较空闲的工作进程有更 ...

  9. 蜗牛—JSONJ学习ava转变

    最近,写网站管理员,使用异步通信技术,所使用的方法是JSON数据传输模式 需要以下jar文件 然后,自己写了一点点经常使用代码 Java的List和数组要用JSONArray对象 Map和实体用JSO ...

  10. Android.mk编译.apk .so .jar .a第三方.apk .so .jar .a的方法

    一.编译一个简单的APK LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java s ...