有一些我试图理解的东西.我在我的AppsController-Class中为Cocoa应用程序提供了这个对象声明
NSMutableArray *personArray;
在可以将此声明放在Header文件中或在代码文件中的类的实现内.没什么区别.我甚至可以将它放在#import命令下的@implementation上下文之外.应用程序工作得很好.
既然我没有从AppsController类继承或做任何其他想象,我想知道这些类型的声明之间可能有什么区别?
声明真的属于哪里?
这取决于您希望如何使用变量.如果将变量声明放在类的接口中,则类的每个实例都将拥有自己的变量副本,该变量与类的所有其他实例分开:
@interface AppsController : NSObject { NSMutableArray *personArray; }
AppsController
该类的每个实例都有自己的personArray
变量副本,该副本与该类的所有其他实例分开.
但是,如果您在接口之外定义变量,它将变为全局变量,并且它是共享的(您的类的实例不会获得自己的副本),并且可以从您的类的任何实例访问它.如果你在标题中声明它:
NSMutableArray *personArray;
它对包含标题的其他文件和类中的方法也是可见的.
如果在实现文件中声明变量,但在实现本身之外,并在前面加上static
关键字,则变量只对类的实现可见.当您需要一个对所有类实例可见但对其他任何人不可见的变量时,这很常见,并且是一种创建类变量的方法.
由于您的对象是控制器对象,我猜您在应用程序中只有一个实例.您应该声明变量:
作为实例变量,如果您的personArray
变量需要对控制器类的每个实例都是唯一的(即使您现在只有一个实例,将来可能会有多个实例).
作为类变量(使用static
关键字),如果您希望变量对您的类的所有实例可见,只有一个共享变量实例.
作为全局变量,如果您希望变量是单个实例(对于类的实例不是唯一的),并且对其他类或其他文件中的代码也是可见的.