小结 C++与Objective-c的编写代码的一些区别
2013-03-13 12:26
232 查看
过完年后,回来开始准备做些iphone的应用软件,于是开始学xcode,学mac,学objective-c。经过半个月的时间开发学习,尽管每天学习查资料的时间远远超过了自己实际写代码的时间,付出总有回报,我先把一些自己认为的C++和Objective-c的不同的地方,罗列一下,包括这几天自己遇到的几个暗坑,真的坑死人了。
1.写协议的时候,objective-c多了两关键字:
@optional,说明以下方法在继承类中,可实现,也可不实现。
@required,说明以下定义的方法,在继承类中必须实现。
2.编译类型。xcode属于运行时动态编译,VC则属于静态编译。个人理解,静态编译利于提前检查代码包括语法错误,动态编译则必须等程序运行了,才会区判断函数,类的各种关系。用很多以前VC的习惯来写XCode项目,很多奇怪的错误,就时这个引起的。
2.函数返回值检查。VC会自动检测有乌返回值,没有,就编译不过去,XCode不会检查,没有的话,等你程序运行到这的时候就会挂调。
3.XCode里可以用#include,也可以用#import,对与Objective-c的代码,最好用#import,因为,多次多一个文件使用#include,会导致重复定义的问题,#import则不会,原因是,#import会判断,#include就不会。
4。Objective-c因为所有的类都继承超类NSOject,所以它能实现那些很有用的反射机制,比如。通过类名,创建类,通过函数名,直接调用某个类的同名函数。C++这些功能就没有,想要的话,就只能自己写代码实现了。
5.新的Xcode使用了ARC机制,比如你定义了局部变量,有了它,你就不用在函数的结尾给它写上减少引用计数了,而且如果你写了,它还会给你报错,我在这里也卡过,因为是别人写的代码,拿到我代码里,这个地方就是编译不通过,解决的办法就是可以在XCode的设置里,把这个功能关掉。
6.平行扩展类的函数可能是Objective-c的独有功能吧。它的功能就是不用继承,而给原先有的类给扩展了,加了自己定义的接口。在要用的时候,包括你这个定义接口的文件即可。定义方法就是
@interface NSDate (Additions) NSDate 原先的类,Additions用于标记扩展的名字,可以自定义。
7.Objective-c的容错机制比较强,很多时候空指针不会报错,空指针调用函数也不报错,所以得用代码检查,否则实现不了效果,VC,则是有空指针,必错,除非你用try...catch...模块。
8.静态函数。Objective-c是用+号表示,而且在它得函数内部,竟然可以引用Self,其实这时候引用得这个Self,并不是这个类自己,具体是什么我也不知道,还得查资料看,我的一个卡了我大半天的错误,就是在这里发生的,原因就是我没注意到这是个静态函数。写C++的时候从来没发生过这种错误。
9.block编程,这个在新的Objective-c库里有很多使用,它的定义是这样的
void (^_functionName)(void); 语法很奇怪。
10.引入第三方Lib库时,最好要在XCode里的Build Setting->Other link flags 里加上-all_load,意思是告诉编译器,给我加载所有lib。我有个问题,就是因为我某断代码引用了第三方Lib里的平行扩展接口(见6条),然后能编译过去,但是程序就是在这个地方会挂掉。我也是找了很久,才找到这个问题的解决方法,就是加上上面的-all_load.
以上就是自己半个月来,所学到的和涉及到的关于语言和代码编辑器差异方面的问题。
1.写协议的时候,objective-c多了两关键字:
@optional,说明以下方法在继承类中,可实现,也可不实现。
@required,说明以下定义的方法,在继承类中必须实现。
2.编译类型。xcode属于运行时动态编译,VC则属于静态编译。个人理解,静态编译利于提前检查代码包括语法错误,动态编译则必须等程序运行了,才会区判断函数,类的各种关系。用很多以前VC的习惯来写XCode项目,很多奇怪的错误,就时这个引起的。
2.函数返回值检查。VC会自动检测有乌返回值,没有,就编译不过去,XCode不会检查,没有的话,等你程序运行到这的时候就会挂调。
3.XCode里可以用#include,也可以用#import,对与Objective-c的代码,最好用#import,因为,多次多一个文件使用#include,会导致重复定义的问题,#import则不会,原因是,#import会判断,#include就不会。
4。Objective-c因为所有的类都继承超类NSOject,所以它能实现那些很有用的反射机制,比如。通过类名,创建类,通过函数名,直接调用某个类的同名函数。C++这些功能就没有,想要的话,就只能自己写代码实现了。
5.新的Xcode使用了ARC机制,比如你定义了局部变量,有了它,你就不用在函数的结尾给它写上减少引用计数了,而且如果你写了,它还会给你报错,我在这里也卡过,因为是别人写的代码,拿到我代码里,这个地方就是编译不通过,解决的办法就是可以在XCode的设置里,把这个功能关掉。
6.平行扩展类的函数可能是Objective-c的独有功能吧。它的功能就是不用继承,而给原先有的类给扩展了,加了自己定义的接口。在要用的时候,包括你这个定义接口的文件即可。定义方法就是
@interface NSDate (Additions) NSDate 原先的类,Additions用于标记扩展的名字,可以自定义。
7.Objective-c的容错机制比较强,很多时候空指针不会报错,空指针调用函数也不报错,所以得用代码检查,否则实现不了效果,VC,则是有空指针,必错,除非你用try...catch...模块。
8.静态函数。Objective-c是用+号表示,而且在它得函数内部,竟然可以引用Self,其实这时候引用得这个Self,并不是这个类自己,具体是什么我也不知道,还得查资料看,我的一个卡了我大半天的错误,就是在这里发生的,原因就是我没注意到这是个静态函数。写C++的时候从来没发生过这种错误。
9.block编程,这个在新的Objective-c库里有很多使用,它的定义是这样的
void (^_functionName)(void); 语法很奇怪。
10.引入第三方Lib库时,最好要在XCode里的Build Setting->Other link flags 里加上-all_load,意思是告诉编译器,给我加载所有lib。我有个问题,就是因为我某断代码引用了第三方Lib里的平行扩展接口(见6条),然后能编译过去,但是程序就是在这个地方会挂掉。我也是找了很久,才找到这个问题的解决方法,就是加上上面的-all_load.
以上就是自己半个月来,所学到的和涉及到的关于语言和代码编辑器差异方面的问题。
相关文章推荐
- 如何编写跨平台C/C++代码的一些断想
- 如何编写跨平台C/C++代码的一些断想
- 编写安全的代码的一些技巧 C++
- C++中一些常用的容器的方法小结(附详细代码及详细注释)
- 内存管理---编写安全的代码的一些技巧 C++
- Objective-C与Java类的一些区别
- 编写高质量iOS代码与OS X代码的effective 方法小结
- 在VS2010下编写C应注意的问题(和编写C++的区别)
- C++中STL的一些代码
- C++头文件里编写实现代码
- C++中关于打印一些字符图形的循环代码
- 编写可复用性更好的C++代码——Band对象和COMToys(三)
- [总结]非托管C++代码调用C#编写的dll方法
- quick 2.23 它们的定义c++代码lua与总结的一些细节
- 共有继承,保护继承,私有继承的区别c++代码实例
- 编写高质量代码:改善C++程序的150个建议(八)
- 初学C++编写的代码积累
- 编写高质量代码:改善C++程序的150个建议(十二)
- 如何编写异常安全的C++代码
- c++ primer plus 看后总结(二) c++一些词汇和代码的解释