?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
objective-c中非帔R要的语法知识Q在此归Uxȝ一下?/strong>
cL法,也称静态方法,指的是用static关键字修饰的Ҏ。此Ҏ属类本n的方法,不属于类的某一个实例(对象Q。类Ҏ中不可直接用实例变量。其调用方式有三U:可直接调用、类?Ҏ名、对象名.Ҏ名。实例方法指的是不用static关键字修饰的Ҏ。每个实例对象都有自w的实例ҎQ互相独立,不共享一个。其调用方式只能是对象名.Ҏ名?br style="margin: 0px; padding: 0px;"/>用修饰符static声明的方法ؓ静态方法,不用修饰Wstatic声明的方法ؓ实例Ҏ。不类生成或未生成对象Q类的静态方法都可以被用,使用格式为:cd.静态方法名。静态方法只能用该静态方法所在类的静态数据成员和静态方法。这是因Z用静态方法时Q该静态方法所在类可能q没有对象,即有对象,׃用类?静态方法名方式调用静态方法,静态方法没有this指针来存攑֯象的地址Q无法判定应讉K哪个对象的数据成员。在cd建对象后Q实例方法才能被使用Q用格式ؓQ对象名.实例Ҏ名。实例方法可以用该Ҏ所在类的所有静态成员和实例成员?br style="margin: 0px; padding: 0px;"/>何时用静态方法,何时用实例方法? 转蝲2Q?/strong> 注:其实静态成员方法也是有对象的,叫做cd象,但这个是在第一ơ访问类成员时触发系l将其加载到内存的,而且该类对象只在E序立闭Ӟ才会释放Qƈ不由E序本n控制?/p> 有三个概念要分清Q类、实例和对象Q类本n加蝲到内存(可能是代码段的内存,不是堆内存,也不是栈内存Q,可以叫做一个对象;创徏一个类的实例,q个实例可以叫做一个对象,所以就有类对象和实例对象之分了Q类对象是一张图U,实例对象是按cd象造出的一楼Q确实都是实实在在存在的东西Q所以叫对象Q只不过性质不同Q一个是囄Q一个是按图UR出来的楼房?/p> 其实Q我也很想知道,q是哪家公司的面试题Q搞得这么不严}?/p> 从这一句话中,可以有两U理解,一是类的静态方法中q回的对象是否需要releaseQ二是调用实例方法需要release吗?是说要调用releaseQ需要先alloc+initQ这时才能调用实例对象的ҎQ用完了,要releaseQ那么直接调用类的静态方法,是否需要releasecLw的对象?/p> 从以上分析,能得Ll论Q该公司刚接触objectiv-cQ该公司面试的h没有真正熟练和掌握objective-cQ也是刚入门的家伙;最后,可能是面试的错了Q或此脓提问的h写错了?/p> 转蝲3Q?/strong> q个好帖子我要马克一下,今天到“静态方法”一下子没反应过来,g你可帮了我大忙了Q那句“静态方法不需要release因ؓ没有对象”也l了我启发,有时候学多了很容易忘记最基础的思想?/p> 注:有同感Q早些年Q无论是学c++Q还是objective-cQ又或是javaQ时间久了,用一些东西成习惯了,׃知道是啥意思了Q所以得常反刍,才易消化?/p> p学五W,用五W,Nq之后,好多字不会拆Q但常用的能打出来,其实是成了习惯了Q而忘了规律?/p> 再比如,你要教小孩子10以内的加减法Q看看怎么教才好,或者你q记得当时怎么学的吗?Q?/p> 20以内的加减法呢??0法和?0法,你小时侯学过吗?俺是没学q,是CQ那时没人教q些个规律,加是正着敎ͼ减是倒着数等{,是卖a,手熟?/p>
先说实例ҎQ当你给一个类写一个方法,如果该方法需要访问某个实例的成员变量Ӟ那么将该方法定义成实例Ҏ。一cȝ实例通常有一些成员变量,其中含有该实例的状态信息。而该Ҏ需要改变这些状态。那么该Ҏ需要声明成实例Ҏ?br style="margin: 0px; padding: 0px;"/>
静态方法正好相反,它不需要访问某个实例的成员变量Q它不需要去改变某个实例的状态。我们把该方法定义成静态方法?br style="margin: 0px; padding: 0px;"/>
关于静态方法和实例Ҏ的一些误区?/strong>
一、静态方法常d存,实例Ҏ不是Q所以静态方法效率高但占内存?br style="margin: 0px; padding: 0px;"/>事实上,Ҏ都是一LQ在加蝲时机和占用内存上Q静态方法和实例Ҏ是一LQ在cdW一ơ被使用时加载。调用的速度基本上没有差别?br style="margin: 0px; padding: 0px;"/>二、静态方法在堆上分配内存Q实例方法在堆栈上?br style="margin: 0px; padding: 0px;"/>事实上所有的Ҏ都不可能在堆或者堆栈上分配内存Q方法作Z码是被加载到Ҏ的代码内存区域,q个内存区域是不可写的?br style="margin: 0px; padding: 0px;"/>三、实例方法需要先创徏实例才可以调用,比较ȝQ静态方法不用,比较单?br style="margin: 0px; padding: 0px;"/>事实上如果一个方法与他所在类型的实例无关Q那么它应该是静态的Q决不会有h把它写成实例Ҏ。所以所有的实例Ҏ都与实例有关Q既然与实例有关Q那么创建实例就是必然的步骤Q没有麻烦简单一说。实际上上你可以把所有的实例Ҏ都写成静态的Q将实例作ؓ参数传入卛_?br style="margin: 0px; padding: 0px;"/>有些Ҏ看似与所在的实例无关Q如IComparer.CompareҎQ但实际上每一个实现这个接口的c都只会负责自己cd实例的比较,q是C#1.x规范中没有泛型所带来的历史遗留问题?br style="margin: 0px; padding: 0px;"/>大部分静态方法是与类的实例有关的Q如各种ParseҎQ他做成静态的原因是他没有实例作ؓ参数。其他的大多是出于语义或者其他目的的考虑?br style="margin: 0px; padding: 0px;"/>W一U方? 声明实例Q调用实例方?br style="margin: 0px; padding: 0px;"/>当一个类有多个实例,例如学生q个c,实例可以有学生甲Q学生乙Q学生丙Q等{,我们qW一U方式。在多线E的情况下,只要每个U程都创q实例Q那么第一U方法通常是线E安全的?br style="margin: 0px; padding: 0px;"/>W二U方式,通过一个静态的实例Q去调用实例Ҏ
q种情况比较ҎQ通常是整个程序里该类唯一的一个实例,我们通过调用该实例的实例Ҏ来改变该实例的某些状态。这一个实例在多线E的情况下,通常是线E不安全的。除非我们给q个实例加锁。防止其他线E访问该实例?br style="margin: 0px; padding: 0px;"/>W三U方式,直接调用静态方?br style="margin: 0px; padding: 0px;"/>q种情况下静态方法不需要去改变某个实例的状态。只要得到少量的参数可完成既定事情。比如判断一个文件是否存在,只要l个文g路径和文件名Q就能知道该文g是否存在?/p>
调用一个类的静态方法需不需要releaseQ(内存理Q(面试题)
我个为,静态成员方法不需要对象,不需要release?br style="margin: 0px; padding: 0px;"/>