关于objective-c类方法的问题

关于objective-c类方法的问题,objective-c,class,Objective C,Class,我知道初始化类时,类变量在内存中声明(而不是在堆栈上),我知道类方法基本上是如何使用的。但是我有一些关于类方法的问题,在基本文档中没有回答 类方法是否也在内存中声明?那么在这些类方法中声明的任何对象呢?它们在范围内是“静态”的吗?任何作为参数传递到类方法中的对象呢?这些也是“静态”的吗 重复调用一个类方法是否意味着该类方法中声明的所有对象都会被一次又一次地分配(每个方法调用一个),或者它们是否位于内存中的一个位置?他们每次跑步都能通过考试吗 例如,这里的do_something方法会发生什么变化

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

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

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

例如,这里的do_something方法会发生什么变化:

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

+ (void) do_something
{
    NSMutableArray *array = [[NSMutableArray alloc] init];
    ...
    [array release];
}
+(void)main
{
而(i
类方法遵循与对象(实例)方法相同的规则,只是不能从类方法访问实例变量,这显然是因为IVAR是按对象实例分配的

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

当调用
+(void)do\u something
方法时,
array
对象将按照您的代码指定每次进行初始化。它只声明了该方法的范围

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

请参阅:

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


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

调用堆栈位于内存中。“在内存中声明”是什么意思?所以在堆上多次分配“数组”显然对性能有害,而不是对象方法,对吗?谢谢。不管是类还是实例方法,分配规则都是一样的+alloc发送+allocWithZone:,后者依次调用malloc()的变体。您可以将数组声明为静态,并在创建它之前对其进行nil测试,这样可以节省分配时间。但是,除非您需要静态对象或必须优化代码,否则您不需要静态对象。首先评测你的应用程序,只有当它成为瓶颈时才进行这种优化。