Objective-C:对象声明问题

Tal*_*ode 1 xcode cocoa objective-c

有一些我试图理解的东西.我在我的AppsController-Class中为Cocoa应用程序提供了这个对象声明

NSMutableArray *personArray;
Run Code Online (Sandbox Code Playgroud)

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

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

声明真的属于哪里?

Ale*_*ski 7

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

@interface AppsController : NSObject
{
    NSMutableArray *personArray;
}
Run Code Online (Sandbox Code Playgroud)

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

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

NSMutableArray *personArray;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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