关于objective-c类方法的问题

时间:2010-01-18 09:26:25

标签: objective-c class

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

类方法是否也在内存中声明?在这些类方法中声明的任何对象怎么样?它们的范围是“静态的”吗?将任何作为参数传递给类方法的对象怎么办?那些也是“静态的”吗?

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

例如,do_something方法会发生什么:

+ (void) main
{
    while (i < MAX)
    {
        [MyClass do_something];
    }
}

+ (void) do_something
{
    NSMutableArray *array = [[NSMutableArray alloc] init];
    ...
    [array release];
}

3 个答案:

答案 0 :(得分:1)

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

在您的示例中,像往常一样,每次调用都会在堆上分配“数组”。

答案 1 :(得分:1)

所有变量都存储在“内存”中,无论其存储类型(静态,自动,免费存储),位置(堆栈或堆),链接或范围如何。只有在变量声明为静态时,变量才是静态的。否则,类方法中的变量,无论是参数还是局部变量,都具有函数或局部作用域,自动存储,无链接,并存储在堆栈中。

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

答案 2 :(得分:0)

调用+(void) do_something方法时,array对象将按照代码指定的方式进行初始化。它只被声明为该方法的范围。

您可以在类范围中声明静态变量。正如您所期望的那样,所有实例和类(也称为静态)方法都可以访问它们。

请参阅:http://www.otierney.net/objective-c.html#class