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

可能iphone开发面试会碰到,个人感觉比较重要,呵呵!特整理下来。欢迎大家不断补充

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

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

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

2、内存管理

当使用allocnew方法或者通过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 方 法,同时还要避免适用创建 自动释放对象的便利函数。)
原文链接: https://www.cnblogs.com/ylucy/archive/2011/05/02/2034284.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/24833

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午2:44
下一篇 2023年2月8日 上午2:44

相关推荐