类方法,也称静态方法,指的是用static关键字修饰的方法。
调用方式有三种:可直接调用、类名.方法名、对象名.方法名。
实例方法指的是不用static关键字修饰的方法。
调用方式只能是对象名.方法名。
需要访问某个实例的成员变量时,那么就将该方法定义成实例方法
一、静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。
事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。
二、静态方法在堆上分配内存,实例方法在堆栈上。
事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。
三、实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单。
事实上如果一个方法与他所在类型的实例无关,那么它就应该是静态的,决不会有人把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必
然的步骤,没有麻烦简单一说。实际上上你可以把所有的实例方法都写成静态的,将实例作为参数传入即可。
有些方法看似与所在的实例无关,如IComparer.Compare方法,但实际上每一个实现这个接口的类都只会负责自己类型实例的比较,这是C#1.x规范中没有泛型所带来的历史遗留
问题。
大部分静态方法是与类的实例有关的,如各种Parse方法,他做成静态的原因是他没有实例作为参数。其他的大多是出于语义或者其他目的的考虑。
第一种方式, 声明实例,调用实例方法
当一个类有多个实例,例如学生这个类,实例可以有学生甲,学生乙,学生丙,等等,我们就用第一种方式。在多线程的情况下,只要每个线程都创建自己的实例,那么第一种方法
通常是线程安全的。
第二种方式,通过一个静态的实例,去调用实例方法
这种情况比较特殊,通常是整个程序里该类唯一的一个实例,我们通过调用该实例的实例方法来改变该实例的某些状态。这一个实例在多线程的情况下,通常是线程不安全的。除非
我们给这个实例加锁。防止其他线程访问该实例。
第三种方式,直接调用静态方法
这种情况下静态方法不需要去改变某个实例的状态。只要得到少量的参数就可完成既定事情。比如判断一个文件是否存在,只要给个文件路径和文件名,就能知道该文件是否存在。
转载2:
调用一个类的静态方法需不需要release?(内存管理)(面试题)
我个人认为,静态成员方法不需要对象,不需要release。
注:其实静态成员方法也是有对象的,叫做类对象,但这个是在第一次访问类成员时触发系统将其加载到内存的,而且该类对象只在程序立闭时,才会释放,并不由程序本身控制。
有三个概念要分清:类、实例和对象,类本身加载到内存(可能是代码段的内存,不是堆内存,也不是栈内存),可以叫做一个对象;创建一个类的实例,这个实例可以叫做一个对
象,所以就有类对象和实例对象之分了,类对象就是一张图纸,实例对象是按类对象造出的一橦楼,确实都是实实在在存在的东西,所以叫对象,只不过性质不同,一个是图纸,一
个是按图纸造出来的楼房。
其实,我也很想知道,这是哪家公司的面试题,搞得这么不严谨。
从这一句话中,可以有两种理解,一是类的静态方法中返回的对象是否需要release;二是调用实例方法需要release吗?就是说要调用release,需要先alloc+init,这时才能调用实
例对象的方法,使用完了,要release;那么直接调用类的静态方法,是否需要release类本身的对象。
从以上分析,能得出这样的结论:该公司刚接触objectiv-c;该公司面试的人没有真正熟练和掌握objective-c,也是刚入门的家伙;最后,可能是面试的人说错了,或此贴提问的
人写错了。
转载3:
这个好帖子我要马克一下,今天碰到“静态方法”一下子没反应过来,楼主你可帮了我大忙了,那句“静态方法不需要release因为没有对象”也给了我启发,有时候学多了很容易忘记最基础的思想。
注:确有同感,早些年,无论是学c++,还是objective-c,又或是java,时间久了,用一些东西成习惯了,就不知道是啥意思了,所以得常反刍,才易消化。