2

我有几个在我的 -viewDidLoad 方法中初始化的 ivar NSArray。一个包含字符串,一个包含 IBOutlets。但是,当我初始化时,数组中的所有对象都超出了范围,并且内存地址为 0x0(根据 Xcode 调试器)。但是,当我有一个具有相同对象的本地 NSArray 时,它可以正常工作。初始化 ivar NSString 或 NSDictionary 都可以正常工作。

编码:

//.h file
#import <UIKit/UIKit.h>
@interface myViewController : UIViewController
{
NSArray *myArray;
}
@end

//.m file
#import "myViewController.h"
@implementation myViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil];
    NSLog(@"myArray equals: %@.", myArray);
}
@end

当我尝试使用该数组时,我得到一个 EXC_BAD_ACCESS 运行时错误。这是一个 Xcode 错误,还是我错过了一些关于 NSArray 的东西?更新:我正在使用 ARC。在我关闭 ARC 并进行干净的构建后,我不再遇到这个问题。这是ARC中的错误吗?

我不知道问题出在哪里,但我切换到了稳定版本的 Xcode (4.0.2) 并且完全没有问题。感谢大家尝试提供帮助!

4

3 回答 3

2

在提出这样的问题时,请务必注意您正在使用 ARC。

您如何尝试使用数组(显示代码)?在某些版本的 ARC 中存在一个已知错误(无法在 iOS 端讨论,但同样的错误出现在 ARC 的 Lion 版本中),在 ARC 下快速枚举集合可能会导致崩溃。

于 2011-08-14T17:52:48.263 回答
0

您的示例代码似乎正在分配 myArray 的新(和本地)版本,而不是设置您在头文件中声明的 iVar。尝试改变:

NSArray *myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil];

myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil];

在 ARC 关闭的情况下,我认为您访问 myArray 的任何尝试都不会执行任何操作,因为它将被设置为 nil 并忽略所有消息。我不确定为什么在启用 ARC 的情况下这段代码的工作方式会有所不同。

于 2011-08-14T18:46:47.800 回答
0

听起来框架还没有实例化 IBOutlet 实例。您可以推迟并填充 viewWillAppear 方法中的数组吗?这将在用户看到任何内容之前被调用。否则,将它们从 IB 中取出,只需手动管理它们并在您想要的任何位置分配它们。

于 2011-08-14T17:56:34.233 回答