【问题标题】:Scope NSArray in Objective-CObjective-C 中的作用域 NSArray
【发布时间】:2020-07-26 13:21:45
【问题描述】:

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

【问题讨论】:

  • 你检查过你的init方法被调用了吗?
  • Init 方法正在被调用。
  • 问题,问题...“在 .m 文件中”,哪个文件? “在 .h 文件中”,哪个文件?哪些文件包含它? initWithCoder: 哪个文件中的哪个类? “inside drawView”,属于哪个文件中的哪个类? //Fails,怎么样?您可能在这里有两个(或更多)不同的变量,但如果没有细节,所有人都只能猜测。使用这些详细信息编辑您的问题,有人可能会帮助您解决问题。 HTH
  • 我做了一些修改谢谢

标签: ios objective-c nsarray


【解决方案1】:

你的问题不清楚。例如。您是否将imageArray 声明为实例变量、全局变量或两者兼有——“在实现的最顶端”可以读作“文件顶部”、“在大括号中@implementation 下方的实现顶部”等.

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

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

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

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

其次,你写“我已经在 GLViewController.h 文件中声明了它”。您通常不会在 .h 文件中声明实例变量,尽管您可以,并且您不要.h 中重新声明全局变量,这样做会产生编译器错误 - 您不要'不报告导致上述可能性的错误,即您可能在不同的范围内有 两个 变量。

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

extern NSArray* imageArray;

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

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

【讨论】:

  • 您好CRD,感谢您的详细解答。我在 initWithCoder 中做了一个 [imageArray retain] 并且它确实有效。不知道为什么一个数组不能保留它的值,我应该像你上面提到的'&'之前取消引用它们吗?
  • 听起来你有一个内存管理问题并且你没有使用 ARC,retain 来解决这个问题表明你正在做一个你不应该做的release。您应该考虑将项目转换为 ARC。 & 仅用于打印变量本身的地址(不是变量中的地址),作为一种简单的方法来确定您是否始终使用相同的变量(而不是不同实例或范围中的变量) .除了此处使用的调试目的之外,您应该很少(如果有的话)在 Objective-C 代码中使用 &(地址)运算符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
相关资源
最近更新 更多