您的位置:首页 > 其它

(原)iphone开发必须知道的几个概念

2011-05-02 10:57 417 查看
可能iphone开发面试会碰到,个人感觉比较重要,呵呵!特整理下来。欢迎大家不断补充

1、object-c与C++的差异

对于同样支持面向对象的 C++来说,跟 ObjC 存在的差异将远远大于 C 语言。C++具备很 多 ObjC 没有的特性,例如多重继承、命名空间、运算符重载、模板、类变量、抽象类、STL 等,但是不用太过担心,ObjC 中都有相关的特性和技术用于替代或者模拟这些特性。

C++与 ObjC 最大的区别在于分配方法的机制不同,C++是基于虚拟表机制确定虚函数调 用什么代码,而 ObjC 使用运行时,函数进入各种类结构中查找相应的代码以供调用。这么一 比,很明显 C++的效率要高的多,正因如此,我们要明确的是,ObjC 牺牲了一定的速度和安 全,换来了灵活和便捷,这是一种权衡利弊的做法。

2、内存管理

当使用alloc、new方法或者通过copy消息创建一个对象时,对象的引用计数器就被设置为1。要增加对象的引用计数器值可以给对象发送一条retain消息。要减少引用计数器的 值可以给对象发送一条release消息。

当一个对象的引用计数器的值变为0时,ObjC自动向对象发送一条dealloc消息,对象的dealloc方法可以被重写,但最后一定要记得给该对象的super发送一条dealloc消息。 该方式可以释放已经分配的全部相关资源,一定不要直接调用dealloc方法。如果在释放对象时需要知道当前引用计数器的值,可以给对象发送一条retainCount消息,该消息返回类型为unsigned。

release和autorelease

上面讲过,release消息可以让对象的引用计数器立即减1,而autorelease呢,你也许会发现在你创建的ObjC项目中,main方法的开头和结尾都会有这样的代码:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

// insert your code...

[pool drain];


这就是Cocoa中引入的自动释放池,它是一个存放实体的池,这些实体可能是对象,能够 被自动释放。于是,NSObject类提供了一个autorelease的方法,该方法预先设定了一条 在某个时间发送的release消息,其返回值是接收到消息的对象。当给一个对象发送 autorelease消息的时候实际上是将该对象添加到NSAutoreleasePool中。当自动释放池 被销毁时,会向该池中的所有对象发送release消息。

自动释放池是一个很让人喜欢的机制,但是,系统资源是有限的,垃圾箱再大也不可能比 放垃圾箱的房子要大,当垃圾塞满了整个房间的时候,大家也就没有心情再用这个房间干其它的事情了。

所以,对于需要频繁创建临时变量或者自动释放对象的代码,请自己创建一个自动释放池,并在这段代码执行结束后释放它,也就是在每个卧室中都放上一个小垃圾桶,不要让所有的垃圾都丢到客厅里面来。

(在开发 iPhone 应用程序的时候,苹 果公司建议你不要在自己的 代码中适用 autorelease 方 法,同时还要避免适用创建 自动释放对象的便利函数。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: