Cocoa Touch NSArray初始化无法正常工作

时间:2011-08-14 17:46:25

标签: objective-c ios cocoa-touch nsarray automatic-ref-counting

我在我的-viewDidLoad方法中初始化了几个ivar NSArrays。一个包含字符串,一个包含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)的稳定版本,我根本没有任何问题。谢谢大家的帮助!

3 个答案:

答案 0 :(得分:2)

当您提出这样的问题时,您正在使用ARC非常重要。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

关闭ARC后,我会假设您访问myArray所做的任何尝试都不会做任何事情,因为它会被设置为nil并忽略所有消息。我不确定为什么这个代码在启用ARC时会有所不同。