为了整洁和可重用,我正在考虑在一个类中放入一堆实用程序方法。该类不需要任何自己的属性,因此我将方法定义为类方法;我认为没有必要让这个类的实例浮动......
......还是有吗?效率有差异吗? (一个值得注意的?)或者调用类方法的行为方式与它们是调用类的一部分相同吗?
答案 0 :(得分:7)
Gavin也是正确的,C函数比类或实例方法更有效。但同样,除非你在紧密循环中调用这些方法数百万次,否则方法与C函数的开销可能对你的应用程序无关紧要。
但是为了回答所提出的问题,类方法和实例方法之间基本没有区别。在Objective-C中,类实际上是对象本身,向它们发送消息与向实例对象发送消息完全相同。每个类基本上都有一个单例对象,可以调用类方法。
答案 1 :(得分:3)
在所有关于效率相关困境的案例中,最好的办法是从编码的角度做有意义的事情 - 让代码尽可能直观且易读。如果事实证明某些事情并不像它需要的那么快,那么就进行分析和优化。
虽然我不认为在这种情况下会有任何区别,但你可以创建一个方法的类和实例版本,在一个循环中运行它一百万次,然后是[NSDate date]
个调用,然后比较时间。
答案 2 :(得分:3)
实际上,最有效的方法是使它们成为C函数。每次调用其中一个时,您都将避免Objective-C运行时的开销。显然,基于你的问题的措辞,你不需要为这些实用方法保留额外的状态,因为你正在考虑让它们成为类方法。
当我保留这样的实用方法时,我大部分时间都将它们作为C函数,因为它是最干净,最有效的。当我可以用它们制作一个Objective-C类作为方法时,如果它们彼此有共同之处,那么以这种方式组织它们是有意义的,或者我是否需要为它们保持状态。
答案 3 :(得分:2)
I made a sample project将调用实例方法与类方法或C函数进行比较。这是一些示例输出:
Class methods: Time to complete: 0.00415796
Single instance: Time to complete: 0.00437099
Using Singleton: Time to complete: 0.071667
Using Global: Time to complete: 0.00534797
Using C function: Time to complete: 0.00302202
您应该从中获得的主要结论是差异可以忽略不计;使用Instruments来分析实际性能瓶颈。
要回到原始问题,您应该使用类方法,因为您的方法不依赖于实例可能包含的任何状态(属性)。性能方面,这只会有所帮助,因为使用实际实例意味着您必须以某种方式分配和访问该实例,这会增加开销(同样,这一切都可以忽略不计)。
使用C函数的速度会快得多,但是你不能像使用类方法那样子类化和覆盖那个C函数。