我希望能够在我的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,因为委托中的数组似乎工作但我无法用它做任何事情。
谁能看到我做错了什么?
答案 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 = ...
。这将为您正确保留对象。