Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C:对象声明问题_Objective C_Cocoa_Xcode - Fatal编程技术网

Objective c 目标C:对象声明问题

Objective c 目标C:对象声明问题,objective-c,cocoa,xcode,Objective C,Cocoa,Xcode,有件事我试着去理解。在Cocoa应用程序的AppsController类中有此对象声明 NSMutableArray *personArray; 在中,可以将此声明放在头文件中或代码文件中类的实现中。这没什么区别。我甚至可以把它放在@implementation上下文之外,就在#import命令下面。这个应用程序运行得很好 由于我没有从AppsController类继承,也没有对它做任何其他有趣的事情,我想知道这些类型的声明之间可能有什么区别 声明真正属于哪里?您可能应该将其放在头文件的接口部

有件事我试着去理解。在Cocoa应用程序的AppsController类中有此对象声明

NSMutableArray *personArray;
在中,可以将此声明放在头文件中或代码文件中类的实现中。这没什么区别。我甚至可以把它放在@implementation上下文之外,就在#import命令下面。这个应用程序运行得很好

由于我没有从AppsController类继承,也没有对它做任何其他有趣的事情,我想知道这些类型的声明之间可能有什么区别


声明真正属于哪里?

您可能应该将其放在头文件的接口部分,这样每个实例化的对象都会有一个实例。我想这是你的意图

我认为如果你把它放在别处,它将被视为一个全局变量。也就是说,personArray将只有一个实例,并且它将在应用程序中的任何位置可见


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

您可能应该将其放在头文件的接口部分,这样每个实例化的对象都会有一个实例。我想这是你的意图

我认为如果你把它放在别处,它将被视为一个全局变量。也就是说,personArray将只有一个实例,并且它将在应用程序中的任何位置可见


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

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

@interface AppsController : NSObject
{
    NSMutableArray *personArray;
}
AppsController
类的每个实例都有自己的
personArray
变量副本,该变量与该类的所有其他实例都是独立的

但是,如果在接口外部定义变量,则该变量将成为全局变量,并且是共享的(类的实例没有自己的副本),并且可以从类的任何实例访问该变量。如果您在标题中声明为:

NSMutableArray *personArray;
它对包含头的其他文件和类中的方法也是可见的

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

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

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

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

    @interface AppsController : NSObject
    {
        NSMutableArray *personArray;
    }
    
    AppsController
    类的每个实例都有自己的
    personArray
    变量副本,该变量与该类的所有其他实例都是独立的

    但是,如果在接口外部定义变量,则该变量将成为全局变量,并且是共享的(类的实例没有自己的副本),并且可以从类的任何实例访问该变量。如果您在标题中声明为:

    NSMutableArray *personArray;
    
    它对包含头的其他文件和类中的方法也是可见的

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

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

  • 如果您的
    personArray
    变量需要对控制器类的每个实例都是唯一的,则将其作为实例变量(即使您现在只有一个实例,将来也可能有多个实例)
  • 作为类变量(使用
    static
    关键字),如果希望该变量对类的所有实例都可见,并且只有一个共享的变量实例
  • 如果希望变量是单个实例(不是您类的实例所独有的)并且对其他类或其他文件中的代码可见,则将其作为全局变量
  • 如果在实现文件中声明变量,但在实现本身之外,并在其前面加上static