Cocos2d-x和Object-C的那些事

来源:互联网 发布:广告公司需要什么软件 编辑:程序博客网 时间:2024/06/11 14:44


很多以前iOS开发者看到这个题目肯定会很奇怪,cocos2d-x作为一个C++实现的引擎,为什么会和Object-C扯上关系?实际上,cocos2d-x是cocos2d-iphone的C++实现,为了更好的迎合原cocos2d使用者的习惯,整个cocos2d-x引擎带有浓浓的object-c味,所以在上手之前,先了解OC的部分特性,会更方便大家理解cocos2d-x的设计思路,并且方便大家能够通过更多的cocos2d的教程,学习如何使用cocos2d-x。

 

    1.神奇的CCObject

在OC中,所有的类都继承于同一个基类--NSObject类,该类定义了一系列的函数操作,使得整个OC体系可读性极强,并且通过这个类的方法,实现了OC的内存管理模式。详情可以参见一下http://blog.sina.com.cn/s/blog_62ba0fdd0100ve9b.html,当中列举了这个神奇的NSObject的使用方法。

与此同时,为了与之对应,cocos2d-x的设计者设计了CCObject类,模拟了NSObject类,这样就可以在c++使用OC的一些特有功能了,从OC界入门的开发者更容易接受。

扩展:NSObject 中 ,NS的意思是 Next Step,N-S是乔帮主被开除出苹果之后创立的公司,90年代后,此公司又被苹果收购,使得乔帮主重新回到苹果,并最终创立了现在的历史格局。

   2.想叫我是谁我就是谁  id类型

-(id)xxxxx

 如果你只懂C++,id这两个字母就足够让你蛋碎了的。C家族中跟这个东西用法最像的,大概是那个十恶不赦的 void* 了...,不过这个id可要安全多了,它声明的是一个任意对象类型,非常动态,可以根据后续的补充变成任何的对象类型,OC的设计者希望这门语言非常灵活,尽可能动态得创建对象,绑定方法。所以下次各位看官如果看到了这位仁兄,可以直接跳掉下面看别的——很讨厌,但很好用;

 3.祖上荫蔽 super

大家肯定在很多cocos2d的教程中看过如下令人神伤的init函数

-(id)init { 

     if ((self=[super init])) 

{ //....... }...




我头一次看到这个的时候特别糊涂...超级初始化(init)是啥意思啊......

其实这个super的意思是,调用父类的init函数。相当于我们最近常说的  “我爸是李刚”,首先调用的是他父亲的关系,然后赋值给自己个(self),这个self跟c++中的this用法相近,代表的是自己个儿。所以我们看到了这段代码翻译成c++,通常是下列样子的

boolGameScene::init() 

{      

    if(!CCLayer::init())     

    {      // .......      }

 }

说明一下,这段代码中的GameScene 函数继承自 CCLayer,所以需要调用CCLayer的init函数。

但其实super的真实用法要远比这强大,如果爹没有指定的函数,它会找爷爷..爷爷没有找祖爷爷..一直找到有为止。

其实通过这段代码也能看出OC强大的动态创建能力,C++中,你需要手动设置对应的类型,而在oc中,id和super就基本上把所有的工作搞定了

有位老外曾经这么形容C++是一辆手动挡的汽车,而OC则是一辆自动挡的。自动挡当然开起来更方便..不过,你看哪位达喀尔拉力赛的选手开自动挡的赛车了呢?

4.无聊的数学家 retain

OC的内存管理使用的是引用记数的内存系统(),内存中的对象都有自己的一个保留记数。每个对象在创建时,其保留记数为1,发送release会使该引用记数-1,retain会使该引用记数+1,当该对象的保留技术降为0时,就是他跟这个世界说拜拜的时候了。这一整套的引用计数规则十分复杂,之后我会用一整篇的博文专门讲这个东东,这里就不细说啦,说多了我都犯糊涂....

扩展: 话说cocos2d-x在C++中模拟了OC的内存管理系统,所以在-x中,依然会看见retain,release,和autorelease富有西域风格的OC关键字,所以有兴趣的读者,还是应该多关注一下这个。

5.邪恶的双生子@property 和@synthesize

又一个OC程序员懒惰明证!请看如下的语句:

头文件中定义:

@property intyear;

然后在实现文件中:

@synthesizeyear;


然后你在函数中调用:

[myGirlFriendssetYear:1990];

[myGirlFriendsyear];

这样就可以设定我未来的女朋友们(因为声明的是复数)的出生日期是 1990年......

等等!不对啊!还没有实现这个函数呢!Year前面的set从哪儿来的??

正确答案是,当使用这一对邪恶的双生子之后,OC会自动为你创建对应的函数,学名叫setter和getter,就是在你创建的数据前面对应增加set,就好像在梦中,我实现了如下函数: 

-(int) year{     return year; }  

-(void) setYear:(int) aYear {     year=aYear; }

非常nice是吧?上述的代码根本不用程序员去写,程序就自动生成了,更NB的是下面的语句

@property (retain) NSString * gilrsName;

@property (nonatomic,copy) NSString* girlsImageName;

先说明一下 NSString就是cocos2d-x中的CCString,其实...也就是C++中的string...

retain关键字上节已经略有提及。第一个语句的意思是,创建一个自动保留属性的新对象,无论对象将来是否会被设置为自动释放(autorelease...好吧又签了一笔账),当对这个对象重新赋值时,前面的值会被自动释放,从而可以长期使用该对象。

第二个则是更高科技一些了...atomic的意思是原子性,意思是不可分割,在多线程环境中,OC会在访问或修改原子属性之前锁定对象,操作完毕之后,解除锁定,这样当两个竞争线程就不会同时修改同一个对象属性了。但如果标记为nonatomic,将会加快访问的速度。

copy,将发送一个复制的信息给被传递对象,保留之,并释放以前的值。它和retain的功能有点相似,但一个是内容复制(copy),一个是指针复制(retain)。

-----------------------------------------

以上是小弟在学习cocos2d-x中遇到的一些小问题,每个问题都令人纠结了一段时间。但其实最佳的解决方案是:学会使用Object-c编程。在这里向大家推荐几本OC的入门书籍,都很薄,都只有200多页,抽出几天时间来看看,对学习cocos2d-x将会非常有帮助。

《好学的Object-C》作者:Jiva DeVoe 内容很不错,不过对setter和getter的部分讲的很不细致。

《Object-C编程》作者:Aaron Hillegass 感觉是个大神级的人物,讲的东西一针见血,绝对不拖泥带水,有几个章节甚至只用了一页纸就给你讲明白了。