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