iPhone - 从AppDelegate访问ViewController中的NSArray?

时间:2011-08-04 18:40:00

标签: iphone objective-c nsarray exc-bad-access

我希望能够在我的iPhone应用程序中访问一组对象。对象数组填充在我的应用程序的appDelegate中,我希望能够在我的一个View Controllers中访问该数组。

我目前在appDelegate.h文件中设置了数组,如下所示:

NSArray *listObjArray;
@property (nonatomic, retain) NSArray *listObjArray;

然后我在AppDelegate中用一些像这样的字符串填充它:

listObjArray = [NSArray arrayWithObjects:@"Hello", @"How", @"are", nil];
NSLog(@"Array size = %i", [listObjArray count]);

它是合成的并且也以dealloc发布。 NSLog在这里返回正确的计数。

在我的ViewController类中,我像这样导入appDelegate:

#import "MyaAppDelegate.h"

然后我像这样访问我的appDelegate和NSArray并尝试在我的View Controller中记录计数:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] 
                                       delegate];

NSLog(@"Before array set");
NSArray *newArray = [appDelegate listObjArray];
NSLog(@"After array set");
NSLog(@"array count = %i", [newArray count]);
NSLog(@"After array count");

此处的日志记录到达“After array set”后,我在尝试从View Controller中的数组中打印计数的行上获得“EXC_BAD_ACCESS”。

从appDelegate打印计数工作正常,并设置newArray,因为委托中的数组似乎工作但我无法用它做任何事情。

谁能看到我做错了什么?

4 个答案:

答案 0 :(得分:2)

我认为你的数组声明应该是:

NSArray *newArray = [[NSArray alloc] initWithArray:appDelegate.listObjArray]

完成后一定要释放它!虽然我不确定你为什么要声明新数组,但你可以这样做:

NSLog(@"array count = %i", [appDelegate.lstObjArray count]);

希望这有帮助!

-Karoly

答案 1 :(得分:1)

如果是合成的,请使用getter。由于您没有使用getter,因此它会为您提供错误的内存访问。

如果您想保留或复制它,也应使用保留或复制。否则newArray和listObjectArray都将指向导致不良行为的相同内存位置。

NSArray * newArray = [[appDelegate getListObjArray] retain];

答案 2 :(得分:1)

试试这个

self.listObjArray = [NSArray arrayWithObjects:@"Hello", @"How", @"are", nil];

应该在getter上进行分配。

答案 3 :(得分:1)

您遇到内存问题:listObjArray = [NSArray arrayWithObjects:@"Hello", @"How", @"are", nil];直接设置实例变量。在此行之后不久,数组将再次释放,这导致您访问NSArray *newArray = [appDelegate listObjArray];中的错误内存位置,因为它已被释放。

填充数组时使用self.listObjArray = ...。这将为您正确保留对象。