Objective-C:对象声明问题

时间:2009-06-13 09:22:59

标签: objective-c cocoa xcode

我试图了解一些事情。我在我的AppsController-Class中为Cocoa应用程序提供了这个对象声明

NSMutableArray *personArray;

在可以将此声明放在Header文件中或在代码文件中的类的实现内。没什么区别。我甚至可以将它放在#import命令下的@implementation上下文之外。应用程序工作得很好。

由于我没有从AppsController类继承或做任何其他想象,我想知道这些类型的声明之间可能有什么区别?

声明真正属于哪里?

3 个答案:

答案 0 :(得分:7)

这取决于您希望如何使用变量。如果将变量声明放在类的接口中,则类的每个实例都将拥有变量的自己的副本,该副本与类的所有其他实例分开:

@interface AppsController : NSObject
{
    NSMutableArray *personArray;
}

AppsController类的每个实例都有自己的personArray变量副本,该变量与该类的所有其他实例分开。

但是,如果您定义接口的外部变量,它将变为全局变量,并且它是共享(您的类的实例不会得到它们的自己的副本),可以从你班级的任何实例访问。如果你在标题中声明它:

NSMutableArray *personArray;

对包含标题的其他文件和类中的方法也是可见的。

如果您在实现文件中声明变量,但在实现本身之外,并在其前面加上static关键字,则该变量只对您的类的实现可见。当您想要一个对所有类实例都可见但对其他任何人不可见的变量时,这很常见,并且是一种创建类变量的方法。

由于您的对象是控制器对象,我猜您在应用程序中只有一个实例。您应该声明变量:

  1. 作为实例变量,如果您的personArray变量需要唯一到控制器类的每个实例(即使您现在只有一个实例,您可能有多个实例它的未来)。
  2. 作为类变量(使用static关键字),如果您希望变量对您的类的所有实例可见,只有一个变量的共享实例。
  3. 如果您希望变量是单个实例(对于您的类的实例不是唯一的),并且对其他类或其他文件中的代码可见,则作为全局变量。

答案 1 :(得分:4)

你应该把它放在头文件的接口部分,这样每个对象实例化时会有一个实例。我认为这是你的意图。

我认为如果你把它放在其他地方,它将被视为一个全局变量。也就是说,只有一个personArray实例,它将在你的应用程序的任何地方可见。

您的应用程序可能正常工作,因为您只有一个AppsController类实例,而没有其他名为personArray的变量。如果您需要第二个AppsController或其他名为personArray的变量,您将遇到问题。

答案 2 :(得分:1)

  

如果在实现文件中声明变量,但在实现本身之外,并在其前面加上static关键字,则该变量只对您的类的实现可见。当您想要一个对所有类实例都可见但对其他任何人不可见的变量时,这很常见,并且是一种创建类变量的方法。

只是为了澄清,在实现文件中声明但在实现部分之外声明的原因变量在类之外是不可用的,因为其他类不知道实现文件中的任何内容。你的import语句引用的是头文件,而不是它们的实现,因此它们对这些实现文件声明一无所知。

无论如何,要创建只能由类访问的静态变量,请在实现文件中进行声明时使用关键字static。您可以将它放在文件的顶部,实现部分的顶部或函数内部,具体取决于您希望范围是什么。

编辑:更正,谢谢彼得