【问题标题】:Objective-C : Object declaration questionObjective-C:对象声明问题
【发布时间】:2009-06-13 09:22:58
【问题描述】:

我试图理解一些事情。我的 AppsController-Class 中有这个对象声明,用于 Cocoa 应用程序

NSMutableArray *personArray;

In可以把这个声明放在头文件里面或者代码文件中类的实现里面。没有什么不同的。我什至可以将它放在#import 命令下的@implementation 上下文之外。应用程序工作得很好。

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

声明真正属于哪里?

【问题讨论】:

    标签: objective-c cocoa xcode


    【解决方案1】:

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

    @interface AppsController : NSObject
    {
        NSMutableArray *personArray;
    }
    

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

    然而,如果你在接口的outside定义了变量,它就变成了一个全局变量,并且它是一个共享的(你的类的实例没有得到它们的自己的副本),并且可以从您的类的任何实例访问。如果你在标题中这样声明它:

    NSMutableArray *personArray;
    

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      我认为如果您将其放在其他地方,它将被视为全局变量。也就是说,personArray 的实例永远只有一个,并且在您的应用程序中的任何位置都可以看到它。

      您的应用程序可能运行良好,因为您只有一个 AppsController 类实例,没有其他名为 personArray 的变量。如果您需要第二个 AppsController,或其他地方称为 personArray 的另一个变量,您会遇到问题。

      【讨论】:

        【解决方案3】:

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

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

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

        已编辑:已更正,谢谢彼得

        【讨论】:

        • 未明确声明为static 的全局变量不是静态的,它们是外部的(C99 §6.9.2 ¶4)。 GCC 有一个编译器选项可以提供这种效果,默认情况下使符号具有隐藏的可见性,但它通常不开启,也不是标准的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        相关资源
        最近更新 更多