1

我想知道使用类方法是否存在任何内存/性能缺陷,或者只是一般的缺陷,例如:

+ (void)myClassMethod:(NSString *)param {
// much to be done...
}

或者

+ (NSArray*)myClassMethod:(NSString *)param {
// much to be done...
    return [NSArray autorelease];
}

在类方法中放置很多功能很方便,尤其是在我必须处理内存管理(iPhone)的环境中,但是在方便的时候通常会有一个问题?

一个例子可能是一个由许多具有非常简单功能的类组成的网络服务。IE

TomorrowsXMLResults;
TodaysXMLResults; 
YesterdaysXMLResults;
MondaysXMLResults;
TuesdaysXMLResults;
.
.
.
n

我在我的 Web 服务类中收集了大量这些,只是实例化了 Web 服务类,并让这个类上的方法调用“结果”类上的类方法。这些类很简单,但它们处理大量 Xml,实例化大量对象等。

我想我是在问类方法在堆栈和内存中是否存在或被视为与实例化对象的消息不同?

或者它们只是在幕后实例化并再次下拉,因此只是节省几行代码的一种方式?

4

2 回答 2

10

简短回答:没有缺点 - 按预期使用

长答案:objective-c 中的类实际上是对象,您可以像其他任何东西一样使用它(检查 -[NSObject class] 的返回类型——指向 obj-c 对象的指针)。当你调用 [yourclass alloc] 时,你实际上是在向 yourclass 发送一条消息,这是一个向运行时描述类的对象。(该方法本身是 malloc() 周围的一堆包装器,因此不涉及任何魔法。)就如何处理这些对象而言,objc 中的所有对象,包括类,都分配在堆中,因此堆栈播放没有部分。编辑:为了清楚起见,使用类方法与实例方法没有区别,除了使用类方法不需要类的实例。

为了进一步了解这些类对象是如何实现的,我推荐http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html

于 2010-04-22T22:15:08.987 回答
0

以我的经验,类方法或在我的定义中的静态函数服务于特定目的。其中之一可以是性能,但前提是它们很小并且不处理大量数据。(即 NSString stringWithString)。如果您正在处理大量数据,您可能知道,您的性能受到的影响在于处理数据,而不是对象的实例化。坚持专注于处理耗时的任务,而不是创建对象来处理任务的开销。

具体答案:类方法在加载时加载,并且始终可供您的应用程序使用,与您描述的大量工作相比,通过类实例化加载它们的代码开销是最小的。(无论如何,它们很可能会被缓存)

于 2010-04-22T20:59:35.627 回答