2010-01-18 114 views
0

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

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

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

例如,会发生什么情况do_something方法在这里:

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

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

调用堆栈在内存中。 “在记忆中声明”是什么意思? – outis 2010-01-18 09:39:01

回答

1

类方法遵循相同的规则,除了你的对象(实例)方法不能从类方法访问实例变量,显然是因为高德得到每分配对象实例。

在您的示例中,“数组”与每个调用一样都在堆上分配。

+0

因此,在堆上多次分配“数组”对性能来说显然是不利的,而不是如果它是对象方法,对吧? 谢谢。 – 2010-01-18 09:51:11

+0

它是一个类或实例方法并不重要,分配规则是相同的。 + alloc发送+ allocWithZone:,然后调用malloc()的变体。你可以声明你的数组是静态的,并在创建它之前对其进行测试,这将为你节省分配时间。但是你不需要静态对象,除非你需要它们或者不得不优化你的代码。首先对您的应用程序进行配置,并且只有在瓶颈时才进行这种优化。 – Costique 2010-01-18 10:31:37

0

当调用+(void) do_something方法array对象将被初始化,为您的代码指定,每一次。它只是被宣布为该方法的范围。

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

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

1

所有变量都存储“存储器”,不管它们的存储类型(静态,自动的,自由存储区),位置(堆栈或堆),键或范围。只有声明为静态时,变量才是静态的。否则,类方法中的变量,无论是参数还是局部变量,都具有函数或局部范围,自动存储,无链接并存储在堆栈中。

类方法具有全局范围内外联动,虽然你可以发送邮件到一个对象(包括类)即使不在范围内的处理程序。内部联系应该是可能的,但我不认为这种语言支持声明具有内部联系的方法。存储类型和位置并不适用于方法,但可以说方法具有静态存储。