在iPhone项目中声明全局变量

use*_*736 14 iphone objective-c iphone-sdk-3.0

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

Dav*_*ong 26

您可以通过几种不同的方式执行此操作:

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

  2. 创建一个.h文件,如"Globals.h".在.h中,将你的数组声明为extern NSMutableArray * myGlobalArray; 然后在你应用程序的其他地方(AppDelegate是一个好地方),只需这样做:myGlobalArray = [[NSMutableArray alloc] init]; 然后你需要数组的任何地方,#import "Globals.h"

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

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

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

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


kub*_*ubi 8

第四个答案是声明您的阵列UIApplicationDelegate并通过它访问它

[[[UIApplication sharedApplication] delegate] myArray];
Run Code Online (Sandbox Code Playgroud)

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

  • +1这也是一个很好的方法.唯一需要注意的是它会产生编译器警告,因为 - [UIApplication委托]返回一个id <UIApplicationDelegate>类型的对象,该对象没有"myArray"方法.解决方案是投射它,但这使得线路更难以准备:`[(MyAppDelegate*)[[UIApplication sharedApplication]委托] myArray];` (6认同)