类方法和实例方法的区别?

2023-12-06

当我在编程中使用实例方法和类方法时,我总是感到困惑。请告诉我实例方法和类方法之间的区别以及彼此的优点。


所有其他答案似乎都被错误的标签所捕获,现已修复。

在 Objective-C 中,实例方法是当消息发送到类的实例时调用的方法。因此,例如:

id foo = [[MyClass alloc] init];
[foo someMethod];
//   ^^^^^^^^^^   This message invokes an instance method.

在 Objective-C 中,类本身就是对象,类方法只是当消息发送到类对象时调用的方法。 IE。

[MyClass someMethod];
//       ^^^^^^^^^^   This message invokes a class method.

请注意,在上面的示例中,选择器是相同的,但因为在一种情况下它被发送到 MyClass 的实例,而在另一种情况下它被发送到 MyClass,所以会调用不同的方法。在接口声明中,您可能会看到:

@interface MyClass : NSObject
{
}

+(id) someMethod;  // declaration of class method
-(id) someMethod;  // declaration of instance method

@end

并在实施中

@implementation MyClass

+(id) someMethod
{
    // Here self is the class object
}
-(id) someMethod
{
    // here self is an instance of the class
}

@end

Edit

抱歉,错过了第二部分。本身没有优点或缺点。这就像问 while 和 if 之间有什么区别,以及其中一个相对于另一个的优点是什么。这有点毫无意义,因为它们是为不同的目的而设计的。

类方法最常见的用途是在需要时获取实例。+alloc是一个类方法,它为您提供一个新的未初始化实例。 NSString 有大量的类方法来给你新的字符串,例如+stringWithForma

另一个常见用途是获取单例,例如

+(MyClass*) myUniqueObject
{
    static MyUniqueObject* theObject = nil;
    if (theObject == nil)
    {
        theObject  = [[MyClass alloc] init];
    }
    return theObject;
}

上面的方法也可以用作实例方法,因为 theObject 是静态的。但是,如果将其设为类方法,则语义会更清晰,并且不必首先创建实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类方法和实例方法的区别? 的相关文章

随机推荐

  • 尝试插入 SQLite 时出现 NullPointerException - Android

    关注 Android 标签的人可能对我很熟悉 我在为我的高分实现 SQLite 数据库方面经历了最困难的时期 这也是我第一次使用 SQLite 我试图插入两个变量 int 和long 我的insert 方法无法正常工作 除上述内容之外的任何
  • 在 XML 中保存 ImageSource (BitmapSource)

    我正在尝试保存和加载ImageSource or BitmapSource 与 XML 文件之间的转换 快速浏览一下SO给了我这个答案 看起来不错 所以我尝试了一下 但得到了一个奇怪的结果 当我尝试这段代码时 一切正常 BitmapSour
  • 自动发布 FLA 文件;多次调用 Process.Start

    问题背景 我使用执行以下操作的 C 程序为 Flash fla 项目文件创建了 一键式 发布流程 更新两个主项目文件中的静态 版本 变量 每个 FLA 项目一个 更改嵌入式 JSFL 模板文件 自动打开 发布特定 FLA 文件 并将其写入磁
  • Spring AOP配置拦截所有异常

    我正在努力编写 配置 ThrowsAdvice 拦截器 我想拦截整个项目中抛出的所有异常 public class ExceptionsInterceptor implements ThrowsAdvice public void afte
  • php zend gdata - 使用 oauth 获取 google 文档列表

    我已经使用我这样设置的有效令牌进行了会话 session token Zend Gdata AuthSub getAuthSubSessionToken GET token Store the session token in our se
  • 如何旋转 JavaScript 数组

    我有这个 JavaScript 数组 a x 1 a y 2 b x 3 b z 4 c y 5 c z 6 如何将其旋转到如下所示的位置 并从上方穿过第二列 x y z a 1 2 null b 3 null 4 c null 5 6 编
  • Python:类型错误:无法解压不可迭代的 int 对象

    查找数组中最大和的代码 def maxsum arry if len arry 0 return 0 summ maximum sum 0 for i in arry summ summ i maximum sum max summ max
  • 具有来自不同表的多个 Select 语句的 MySQL 存储过程

    我正在尝试从 mysql 存储过程中的不同表中进行多次选择 如下所示 DELIMITER CREATE PROCEDURE NovemberSummary IN branch VARCHAR 60 IN year INT NOT DETER
  • ORA-04091: 表 xx_xx 正在发生变化,触发器/函数可能看不到它

    因此 我必须创建一个触发器 将对名为 passengerlist1 的表所做的更改记录到名为 logs 的额外表中 日志表 create table logs p name varchar 255 p surname varchar 255
  • 如何计算 CoreData 对象的唯一日期?

    我需要一种正确的方法来计算具有 NSDate 类型属性的 CoreData 对象中有多少个唯一的天数 例如 我有以下内容 date 2014 05 15 21 29 12 0000 date 2014 05 15 21 49 34 0000
  • Global.asax 找不到代码隐藏类

    当我尝试运行我继承的 Web 应用程序时 我不断收到此错误 它是在 2010 年为 C 3 5 编写的 并使用 Mvc 2 我已经安装了必要的库 但出现了此错误 错误1 无法加载类型 AdminConsole MvcApplication
  • 如何在C#中提取rar文件?

    我想使用 cmd shell 提取 rar 文件 所以我编写了以下代码 string commandLine c progra 1 winrar winrar e c download TestedU rar c download Proc
  • xpath 不包含 A 和 B

    我怎样才能添加not contains facebook not contains twitter 到我的xpath sites selector xpath h3 class r a href not contains google hr
  • 我可以在哪里获取我的通用应用程序的客户端密钥?

    I m following this guide http msdn microsoft com library windows apps hh465407 to implement push notifications on my app
  • 有没有办法让 Go 的通道表现得像堆栈

    据我所知 默认情况下 Go 通道的行为类似于队列 先进先出 有什么办法可以将它们更改为后进先出吗 基本上 我正在进行搜索 并希望出于内存限制而使用 DFS 而不是 BFS 不 这是不可能的 通道始终是 FIFO 你可以使用包containe
  • 如何增加 OpenGL 缓冲区?

    是否可以在 OpenGL 中增加缓冲区 假设我想使用实例渲染 每次在世界上产生一个新对象时 我都必须使用实例化数据更新缓冲区 在本例中 我有 3 个浮点数的缓冲区 std vector
  • 如何通过镜头让玩家被摧毁?

    我在通过摄像机让玩家被摧毁时遇到了一些麻烦 在我的应用程序中 我让相机跟随玩家 球 但摄像机只能跟随球向上 所以我想要完成的是 当玩家 球 到达界面 屏幕 的底部时 它就会被摧毁 当它被摧毁后 如果弹出一个新的活动 新屏幕 那就太好了 那就
  • Sql server 2008 - 插入大量数据的性能调整功能

    我必须将大量数据插入表中 sqlserver 2008 与 2005 相比 是否有任何新功能可以提高这种情况下的性能 SQL Server 2008 包含MERGETSQL 语句可以加速某些类型的组合 INSERT UPDATE 和 DEL
  • Android 拆分操作栏,操作项位于顶部和底部?

    有没有办法将某些操作项指定到拆分操作栏的顶部 而其他操作项指定到底部 或者是全有或全无 即所有操作项仅进入拆分的底部 目前这是不可能的 请参阅 Android 开发者 Reto Meier 和 Roman Nurik 在 Android 开
  • 类方法和实例方法的区别?

    当我在编程中使用实例方法和类方法时 我总是感到困惑 请告诉我实例方法和类方法之间的区别以及彼此的优点 所有其他答案似乎都被错误的标签所捕获 现已修复 在 Objective C 中 实例方法是当消息发送到类的实例时调用的方法 因此 例如 i