使用Objective C中的类方法的缺点

时间:2010-04-22 18:49:14

标签: objective-c class-method

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

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

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

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

一个例子可能是一个思想的Web服务,它包含许多具有非常简单功能的类。即

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

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

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

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

2 个答案:

答案 0 :(得分:10)

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

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

有关如何实现这些类对象的进一步阅读,我建议http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html

答案 1 :(得分:0)

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

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