在iPhone项目中声明全局变量

时间:2009-08-08 15:19:33

标签: objective-c iphone iphone-sdk-3.0

如何声明全局NSArray然后在我的应用程序中使用它?

6 个答案:

答案 0 :(得分:26)

有几种不同的方法可以做到这一点:

  1. 不是将其声明为全局变量,而是将其包装在单个对象中,然后在任何地方使用单例(通过#importing .h文件)

  2. 创建一个.h文件,例如“Globals.h”。在.h中,将数组声明为extern NSMutableArray * myGlobalArray;然后在应用程序的其他位置(AppDelegate是一个好地方),只需执行:myGlobalArray = [[NSMutableArray alloc] init];然后在任何需要数组的地方,只需{{1 }}

  3. 这就像#2,但没有全局标题。您可以在项目的.pch文件的#import "Globals.h"块中将数组定义为extern NSMutableArray *myGlobalArray;。 .pch文件是一个头文件,会自动#imported到项目中的每个文件中。

  4. 每种方法都有利弊。在不同的情况下,我在不同的时间使用了这三种。我会说单例方法可能是最合适的,因为它对于初始化,访问限制和内存管理来说是最灵活的。但是,如果您不需要,则可能没有必要。

    如果你有很多“全局”变量不希望暴露给项目中的每个文件,那么选项#2就很好了。你可以#import它在需要的地方。但是,这种方法(以及#3)将声明与初始化解除关联(即,对象不是在声明它的位置附近创建的)。有些人可能认为这不合适,而且可能是正确的。

    选项#3很好,因为你永远不必记住#import任何东西。但是,它提出了与选项#2相同的问题。

答案 1 :(得分:8)

第四个答案是在UIApplicationDelegate中声明数组并通过

访问它
[[[UIApplication sharedApplication] delegate] myArray];

有些时候我只需要一些全局对象,我发现这是最简单,最干净的方法。

答案 2 :(得分:2)

如果您正在考虑为应用程序存储某种共享首选项,请使用[NSUserDefaults sharedDefaults]来保存可在应用程序中使用的简单数据。如果您正在存储瞬态数据,那么“静态”方法将像其他地方一样工作。

然而,对于类访问器(如NSUserDefaults)使用单例对象方法可能更好,然后提供实例访问器方法来获取数据。这样,您将在未来将自己与潜在的数据结构变化隔离开来。然后,您将使用静态var,如上所述,但在.m文件中(因此您不需要'extern'定义)。它通常看起来像:

static Foo *myDefault = nil;
@implementation Foo
+(Foo)defaultFoo {
  if(!myDefault)
    myDefault = [[Foo alloc] init]; // effective memory leak
  return myDefault;
}
@end

然后你就拥有了实例访问器,并将它们用作[[Foo defaultFoo] myArray],可以从应用程序的任何部分访问它们,而且没有任何编译时错误。

答案 3 :(得分:1)

这里的每个人似乎都有一个隐含的,省略的第一行:“你可以做到K& R C风格,或......”

是的,你仍然可以做C风格。

在档案1中:

NSArray *MyArray;

在文件2中:

extern NSArray *MyArray;

在这里扮演队长明显。

答案 4 :(得分:1)

参考Dave的答案:

  

这就像#2,但没有全局标题。您可以将数组定义为static extern NSMutableArray * myGlobalArray;在项目的.pch文件的#ifdef OBJC 块中。 .pch文件是一个头文件,它会自动#imported到项目中的每个文件中。

typedef是一个存储类,static是一个存储类,您只能在一个存储类中定义对象。取出“静态”将允许应用程序编译上面的答案。

答案 5 :(得分:0)

有几种可能性。最受欢迎:

1使用单身对象 - http://www.galloway.me.uk/tutorials/singleton-classes/

2在app delegate中声明它:

@interface Your_App_Delegate : UIResponder <UIApplicationDelegate>

@property (nonatomic, strong) NSArray *array;
   . . .

并访问它:

((Your_App_Delegate*)[[UIApplication sharedApplication] delegate]).array;

3使用NSUserDefault