代码之家  ›  专栏  ›  技术社区  ›  Z S

关于客观C类方法的问题

  •  0
  • Z S  · 技术社区  · 15 年前

    我知道在初始化类时,类变量在内存中声明(而不是在堆栈上声明),并且我知道基本上如何使用类方法。但是我有一些关于类方法的问题,在基本文档中没有回答。

    类方法是否也在内存中声明?这些类方法中声明的任何对象如何?它们在作用域中是“静态”的吗?对于作为参数传递到类方法中的任何对象怎么办?这些也是“静态”的吗?

    重复调用一个类方法是否意味着它中声明的所有对象都会被一次又一次地分配(每个方法调用一个),或者它们是生活在内存中的一个位置?每次跑步都会被清除吗?

    例如,这里的“做什么”方法会发生什么:

    + (void) main
    {
        while (i < MAX)
        {
            [MyClass do_something];
        }
    }
    
    + (void) do_something
    {
        NSMutableArray *array = [[NSMutableArray alloc] init];
        ...
        [array release];
    }
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   Costique    15 年前

    类方法遵循与对象(实例)方法相同的规则,除非您不能从类方法访问实例变量,显然是因为每个对象实例都分配了IVAR。

    在您的示例中,“array”像往常一样,在堆上与每个调用一起分配。

        2
  •  1
  •   outis    15 年前

    所有变量都存储在“内存”中,不管它们的存储类型(静态、自动、自由存储)、位置(堆栈或堆)、链接或作用域。变量只有在声明为静态时才是静态的。否则,类方法中的变量,无论是参数还是局部变量,都有函数或局部作用域,自动存储,没有链接,存储在堆栈上。

    类方法具有全局范围和外部链接,尽管您可以向对象(包括类)发送消息,即使范围中没有处理程序。内部链接应该是可能的,但我认为该语言不支持使用内部链接声明方法。存储类型和位置并不真正适用于方法,但可以说方法具有静态存储。

        3
  •  0
  •   Tom Duckering Sorin Antohi    15 年前

    当呼叫 +(void) do_something 方法 array 每次都将按照代码的指定初始化对象。它只声明该方法的范围。

    可以在类作用域中声明静态变量。正如您所期望的,所有实例和类(也称为静态)方法都可以访问这些。

    见: http://www.otierney.net/objective-c.html#class