Scope NSArray in Objective-C



在GLViewController.m文件中

在实施的最高层

NSArray* imageArray ;

然后在GLViewController 内的GLViewController.m中

- (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.m 中包含GLViewController.h

您的问题不清楚。例如,您是否已将imageArray声明为实例变量、全局变量,或者可能同时声明为二者?"At the very top of Implementation"可以读作"top of file"、"top of Implementation just below@implementationin brackets"等。

所以我们在猜测,希望它能有所帮助。

首先,根据你的报告;init运行,但in和实例方法访问实例变量以某种非指定的方式"失败";可能有两个不同的变量在不同的作用域中声明。如果没有一个最小的可重复的例子,我们就不能更具体。你可以尝试插入:

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

在不同的位置,将每个位置的"A"(更改为"B"、"C"…(,访问imageArray。这将打印变量本身的地址,您可以从中确定是否总是引用同一变量,以及变量的内容作为地址,您也可以从中判断值是否在更改,即它是nil还是它引用的数组已更改。

第二,您要写"我也在GLViewController.h文件中声明了它"。您通常不会在.h文件中声明实例变量,尽管您可以,并且您不会.h中重新声明全局变量,这样做应该会产生编译器错误——您不会报告这样的错误,这会导致您可能在不同的作用域中有两个变量。

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

extern NSArray* imageArray;

extern声明此行不是声明变量本身,而是在其他地方声明变量并可访问。(您可能想知道为什么不将extern添加到函数/方法中,在这种情况下,extern是隐式的。(

希望这在某种程度上有所帮助。如果这根本没有帮助,我建议你问一个全新的问题,提供更多的细节,最少的可重复的例子,等等。(如果你现在编辑这个问题,人们可能会认为他们已经看到了这个问题而错过了编辑。(你可以随时删除这个问题,以减少混乱。

最新更新