自学XCode / Objective-C:'静态'似乎并不意味着我认为*它意味着什么

时间:2010-11-02 01:30:00

标签: objective-c

我正在研究Holzner所着的“Visual Quick Start,Objective-C”一书中的例子。我花了很多时间在每个例子上,调试代码是更快的部分,然后逐步告诉自己为什么每行代码都工作,每行中的每个单词做什么,并决定作者使用一种做法的原因事情与另一个。然后我用自己的一些故事重复这个例子。这似乎是从结构化程序员转变为类似oop的好方法。它适用于这些示例,因为他一次只做一个概念。 (我已经完成了另外两本书的工作,这个想法对我来说不起作用。一旦我对某些东西感到困惑,我就会感到困惑。在更长,更复杂的例子中有太多的变数。)

在当前示例(第137页)中,Holzner使用“静态”一词。我查看了本书中的示例来确定这个词的含义。我还阅读了Bjarne Stroustrups的C ++编程语言书中的描述(我理解C ++和Objective-C并不完全相同)

(Bjarne Stroustup p 145) 使用静态变量作为内存,    而不是“可能被其他函数访问和破坏”的全局变量

以下是我理解的“静态”意味着结果。我认为这意味着静态变量的值永远不会改变。我认为这意味着它就像一个常数值,一旦你将它设置为1或5,它就无法在那次运行中被改变。

但是在这段代码中,静态变量的值会发生变化。所以我真的不清楚'静态'意味着什么。

(请忽略我留下评论的'后续问题'。我不想改变我的运行中的任何内容,并冒险创建阅读错误

感谢您提供给我的任何线索。我希望我没有在这个问题上加入太多细节。

月桂

.....

Program loaded.
run
[Switching to process 2769]
Running…
The class count is 1
The class count is 2

Debugger stopped.
Program exited with status value:0.

.....

//
//  main.m
//  Using Constructors with Inheritance
//Quick Start Objective C page 137
//

#include <stdio.h>

#include <Foundation/Foundation.h>

@interface TheClass : NSObject

// FOLLOWUP QUESTION - IN last version of contructors we did ivars like this
//{
//  int number;
//}

// Here no curly braces. I THINK because here we are using 'static' and/or maybe cuz keyword?
//   or because in original we had methods and here we are just using inheirted methods

//  And static is more long-lasting retention 'wise than the other method
//             * * * 

// Reminder on use of 'static' (Bjarne Stroustup p 145)
// use a static variable as a memory, 
//     instead of a global variable that 'might be accessed and corrupted by other functions'

static int count;

// remember that the + is a 'class method' that I can execute 
//         using just the class name, no object required (p 84. Quick Start, Holzner)

// So defining a class method 'getCount'

+(int) getCount;


@end

@implementation TheClass

-(TheClass*) init
{
    self = [super init];
    count++;
    return self;
}

+(int) getCount
{ 
    return count;
}

@end


// but since 'count' is static, how can it change it's value? It doeeessss....


int main (void) {
    TheClass *tc1 =  [TheClass new]  ;
    printf("The class count is %i\n", [TheClass getCount]);

    TheClass *tc2 =  [TheClass new]  ;
    printf("The class count is %i\n", [TheClass getCount]);


    return 0;
}

3 个答案:

答案 0 :(得分:10)

“static”与C ++“const”不同。相反,它是一个声明,变量只被声明一次,并在内存中保持(因此是静态的)。假设你有一个功能:

int getIndex()
{
    static int index = 0;
    ++index;
    return index;
}

在这种情况下,“static”告诉编译器将索引值保留在内存中。每次访问它时都会改变:1,2,3,....

将其与:

进行比较
int getIndex()
{
    int index = 0;
    ++index;
    return index;
}

每次创建索引变量时,每次都会返回相同的值:1,1,1,1,1,....

答案 1 :(得分:4)

static在C / C ++ / Objective-C中意味着很多东西。

Objective-C紧跟C。在C ++中,static意味着比C / Objective-C更多的东西。因此,不要通过Bjarne Stroustrup所说的(谁是C ++的发明者)判断Obj-C中static的作用。

在C和Objective-C中,static的两个主要含义是

  1. 对于文件级别的变量/函数,它使变量/函数不可见于其他转换单元(即编译到同一程序中的其他源文件。)并不意味着它的常量。

  2. 对于在函数内声明的变量,它使变量不驻留在堆栈中但位于更持久的位置,特别是没有人解释。

  3. 在C ++中,除了这个含义之外,类中的static成员意味着它属于类,而不属于实例。这个含义与其他含义完全无关;在过去,人们不想在语言中引入更多的保留词,所以他们只是在不同的语境中滥用相同的保留词来表示完全不相关的事物。另一个臭名昭着的例子是使用单词virtual

    无论如何,static并不意味着它是恒定的。

    无论如何,在编程语言中,事物意味着实施者或标准委员会成员决定的意思。因此,我发现阅读standard总是有帮助的。只需在该PDF中查找单词static即可。您将在编程语言C中了解有关static关键字的所有内容。

答案 2 :(得分:4)

为了澄清特别是没有人的答案,静态变量将在所有对象实例,方法调用等之间保持不变。

例如,声明以下方法:

- (int)getNumber {
    static int number = 0;
    return ++number;
}
在任何给定时间,

将在给定类的所有实例中返回1,2,3,4等。干净,嗯?