代码之家  ›  专栏  ›  技术社区  ›  RickiG

在目标C中使用类方法的缺点

  •  1
  • RickiG  · 技术社区  · 14 年前

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

    + (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服务类,让这个类上的方法调用“results”类上的类方法。班级 很简单,但是它们处理大量的XML,实例化许多对象等。

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

    或者,它们只是在后台实例化并再次下拉,这样,仅仅是保存几行代码的一种方法?

    2 回复  |  直到 14 年前
        1
  •  10
  •   Jared Pochtar    14 年前

    简短回答:没有负面影响-按预期使用

    答案很长:objective-c中的类实际上是对象,您可以像其他任何东西一样使用(检查返回类型-[nsObject class]——指向obj-c对象的指针)。当您调用[yourclass alloc]时,实际上是在向您的类发送一条消息,这是一个向运行时描述类的对象。(方法本身是围绕malloc()的一堆包装纸,因此不涉及任何魔法。)至于如何处理这些对象, 所有 objc中的对象(包括类)在堆中分配,因此堆栈不起作用。编辑:要明确一点,使用类方法和使用实例方法没有区别,只是使用类方法时不需要有该类的实例。

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

        2
  •  0
  •   gnasher    14 年前

    根据我的经验,类方法,或者在我的定义静态函数中,都有特定的用途。其中之一可以是性能,但前提是它们很小并且不处理大量数据。(即nsstring stringwithstring)。如果您处理的是大量的数据,那么您的性能冲击,正如您可能意识到的,是处理数据,而不是对象的实例化。坚持专注于处理耗时的任务,而不是创建用于处理任务的对象的开销。

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