如何声明全局NSArray然后在我的应用程序中使用它?
答案 0 :(得分:26)
有几种不同的方法可以做到这一点:
不是将其声明为全局变量,而是将其包装在单个对象中,然后在任何地方使用单例(通过#importing .h文件)
创建一个.h文件,例如“Globals.h”。在.h中,将数组声明为extern NSMutableArray * myGlobalArray;
然后在应用程序的其他位置(AppDelegate是一个好地方),只需执行:myGlobalArray = [[NSMutableArray alloc] init];
然后在任何需要数组的地方,只需{{1 }}
这就像#2,但没有全局标题。您可以在项目的.pch文件的#import "Globals.h"
块中将数组定义为extern NSMutableArray *myGlobalArray;
。 .pch文件是一个头文件,会自动#imported到项目中的每个文件中。
每种方法都有利弊。在不同的情况下,我在不同的时间使用了这三种。我会说单例方法可能是最合适的,因为它对于初始化,访问限制和内存管理来说是最灵活的。但是,如果您不需要,则可能没有必要。
如果你有很多“全局”变量不希望暴露给项目中的每个文件,那么选项#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;