Objective-C 范围内的 NSArray

Scope NSArray in Objective-C

在GLViewController.m文件中

在实施的最顶端

NSArray* imageArray ;

然后在 GLViewController.m 里面的 GLViewController

- (id)initWithCoder:(NSCoder*)coder 
{
 imageArray  = @[ @"baban.jpg",@"cete.jpg",@"cipan.jpg",@"kuc.jpg"];
}

在 GLViewController.m

中的 drawView 内部
NSLog(imageArray[0]);  //Fails

我也在 GLViewController.h 文件中声明了它:

NSArray* imageArray;

我将 GLViewController.h 包含在 GLViewController.m

你的问题不清楚。例如。您是否已将 imageArray 声明为实例变量、全局变量或可能两者 - "At the very top of Implementation" 可以读作 "top of file"、"top of implementation just below @implementation in braces" 等

所以我们在猜测,希望对您有所帮助。

首先,根据您的报告; init 运行但在实例方法中以某种非指定方式访问实例变量 "fails";你可能两个在不同范围内声明的不同变量。没有 minimal reproducible example 我们就不能更具体了。您可以尝试插入:

NSLog(@"Loc A imageArray @%p = %p", &imageArray, imageArray);

在不同的位置,您可以在每个位置更改 "A"(至 "B"、"C"...),您可以在其中访问 imageArray。这将打印变量本身的地址,从中您可以确定您是否始终引用 same 变量,并将变量的内容作为地址,从中您可以确定值正在改变,即它是 nil 还是它引用的数组已经改变。

其次,你写"I've got it declared in the GLViewController.h file too"。尽管可以,但您通常不会在 .h 文件中声明实例变量,并且您 不会 .h 中重新声明全局变量,这样做应该产生编译器错误——您没有报告这样的错误,这会导致上述可能性,即您可能在不同的范围内有 两个 个变量。

如果您希望在 file.m 中声明一个全局变量并让不同文件中的其他代码可以访问它,那么在 file.h 中您可以为它包含一个 extern 声明:

extern NSArray* imageArray;

extern 声明此行并未声明变量本身,而是在别处声明了变量并且可以访问该变量。 (您可能想知道为什么不将 extern 添加到 functions/methods,在这种情况下 extern 是隐含的。)

希望对您有所帮助。如果这根本没有帮助,我建议你问一个全新的问题,提供更多细节、最小可重现的例子等。(如果你现在编辑这个问题,人们可能会错过编辑,认为他们已经看到了这个问题。)你可以始终删除此问题以减少混乱。