Objective-C 关于静态方法与实例方法的转载

Objective-C 关于静态方法与实例方法的转载

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生
-  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

转载1: http://www.cocoachina.com/bbs/read.php?tid=52105

objective-c中非常重要的语法知识,在此归纳总结一下。 

类方法,也称静态方法,指的是用static关键字修饰的方法。此方法属类本身的方法,不属于类的某一个实例(对象)。类方法中不可直接使用实例变量。其调用方式有三种:可直接调用、类名.方法名、对象名.方法名。实例方法指的是不用static关键字修饰的方法。每个实例对象都有自身的实例方法,互相独立,不共享一个。其调用方式只能是对象名.方法名。 
用修饰符static声明的方法为静态方法,不用修饰符static声明的方法为实例方法。不管类生成或未生成对象,类的静态方法都可以被使用,使用格式为:类名.静态方法名。静态方法只能使用该静态方法所在类的静态数据成员和静态方法。这是因为使用静态方法时,该静态方法所在类可能还没有对象,即使有对象,由于用类名.静态方法名方式调用静态方法,静态方法没有this指针来存放对象的地址,无法判定应访问哪个对象的数据成员。在类创建对象后,实例方法才能被使用,使用格式为:对象名.实例方法名。实例方法可以使用该方法所在类的所有静态成员和实例成员。 
何时用静态方法,何时用实例方法? 
先说实例方法,当你给一个类写一个方法,如果该方法需要访问某个实例的成员变量时,那么就将该方法定义成实例方法。一类的实例通常有一些成员变量,其中含有该实例的状态信息。而该方法需要改变这些状态。那么该方法需要声明成实例方法。 

静态方法正好相反,它不需要访问某个实例的成员变量,它不需要去改变某个实例的状态。我们把该方法定义成静态方法。 

关于静态方法和实例方法的一些误区。  
一、静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。 
 事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。 
二、静态方法在堆上分配内存,实例方法在堆栈上。 
事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。
三、实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单。 
    事实上如果一个方法与他所在类型的实例无关,那么它就应该是静态的,决不会有人把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。实际上上你可以把所有的实例方法都写成静态的,将实例作为参数传入即可。 
    有些方法看似与所在的实例无关,如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,时间久了,用一些东西成习惯了,就不知道是啥意思了,所以得常反刍,才易消化。

就象学五笔,用五笔,N年之后,好多字不会拆,但常用的能打出来,其实是成了习惯了,而忘了规律。

再比如,你要教小孩子10以内的加减法,看看怎么教才好,或者你还记得当时怎么学的吗?!

20以内的加减法呢?借10法和凑10法,你小时侯学过吗?俺是没学过,就是记住,那时没人教这些个规律,加是正着数,减是倒着数等等,就是卖油翁,手熟尔。

时间: 2024-10-27 16:00:45

Objective-C 关于静态方法与实例方法的转载的相关文章

java静态方法和实例方法的区别

静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名. 方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方式.也就 是说,调用静态方法可以无需创建对象. 静态方法在访问本类的成员时,只允许访问静态成员(即静 态成员变量和静态方法),而不允许访问实例成员变量和实例方法:实例方法则无此限制. 下面几个 例子展示了这一区别. 1.调用静态方法示例. //-----------hasStaticMethod.java-

关于c#静态方法和实例方法的辨析和应用

本文将围绕c#静态方法和实例方法讨论一下.针对一些观点,如:"静态方法是常驻内存", 还有"静态方法比实例方法先装载",做一个辨析.同时讨论下何时用静态方法,何时用实例方法. 前几日,在微软的好友发给我一个链接:<静态方法和实例化方法之间的区别你知道了嘛? 欢迎讨论!! - 问题最终 ...>,然后说这里某些观点需要澄清一下,希望我写一篇blog.我当时读了这篇blog. 文比较短,列举了静态方法和实例方法的几种案例,也没有论点,然后就请大家讨论.后面评

Js类的静态方法与实例方法区分及jQuery拓展的两种方法_javascript技巧

上学时C#老师讲到对象有两类方法,静态方法(Static)和实例方法(非Static),当时不理解静态是为何意,只是强记. 后来从事了前端的工作,一直在对类(即对象,Js中严格来说没有类的定义,虽众所周知,这里还是赘述一番,以免产生歧义)的操作上,严重缺乏整体概念,最近看extetnd中再次提到拓展静态方法与实例方法,故而再次百度,才幡然领悟,其实一直有用,只是不知其专业术语呀,哈哈~ 静态方法,属于类的方法,即类可以直接调用的方法.为类所有实例化对象所共用(但不能用实例对象之间调用),所以静态

关于静态方法和实例方法的一些误区。

转自<关于静态方法和实例方法的一些误区.> 一. 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存.     事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载.调用的速度基本上没有差别. 二. 静态方法在堆上分配内存,实例方法在堆栈上.     事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的. 三. 实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单.

一起谈.NET技术,关于c#静态方法和实例方法的辨析和应用

本文将围绕c#静态方法和实例方法讨论一下.针对一些观点,如:"静态方法是常驻内存", 还有"静态方法比实例方法先装载",做一个辨析.同时讨论下何时用静态方法,何时用实例方法. 前几日,在微软的好友发给我一个链接:<静态方法和实例化方法之间的区别你知道了嘛? 欢迎讨论!! - 问题最终 ...>,然后说这里某些观点需要澄清一下,希望我写一篇blog.我当时读了这篇blog. 文比较短,列举了静态方法和实例方法的几种案例,也没有论点,然后就请大家讨论.后面评

js静态方法与实例方法分析_javascript技巧

js静态方法 复制代码 代码如下: function foo(){} // 声明类 foo.method = function(){} // 方法体 使用:foo.method() js实例方法 function foo(){ // 声明类 this.method = function(){ // 方法体 } } 使用:var f = new foo(); f.method();

在何种情况下,使用静态方法和实例方法?

问题描述 在什么情况下,使用静态方法?在情况下,使用实例方法? 解决方案 解决方案二:静态方法:对实例没有访问要求的时候用,属于这个类的类方法.实例方法:使用时必须创建这个对象.也就是要用到对象中方法的时候,反之,本类中的方法将来会被其它类调用的时候.也叫作对象方法.解决方案三:看情况了,项目中一些共通的部分,比如读取配置,写LOG,可以用静态方法.操作比较简单.如果是一个对象要多次被处理,考虑使用实例方法比如.NET中对文件操作有静态的File类和FileInfo类前面都是静态方法,后面是实例

objective c-调用parent ViewController实例方法

问题描述 调用parent ViewController实例方法 添加了一自定义view到Viewcontroller: [bTVC addSubview:customView]; 现在我想调用一个实例方法,在viewControlller中: [self.parentViewController instanceMethod]; 应该怎么实现? 解决方案 就算这么写能实现也不应该这么写,耦合太大,应该用delegate,声明一个delegate,然后让他父类去实现他

JNI/NDK开发指南(六)——C/C++访问Java实例方法和静态方法

        转载请注明出处:http://blog.csdn.net/xyang81/article/details/42582213         通过前面5章的学习,我们知道了如何通过JNI函数来访问JVM中的基本数据类型.字符串和数组这些数据类型.下一步我们来学习本地代码如何与JVM中任意对象的属性和方法进行交互.比如本地代码调用Java层某个对象的方法或属性,也就是通常我们所说的来自C/C++层本地函数的callback(回调).这个知识点分2篇文章分别介绍,本篇先介绍方法回调,在