【问题标题】:iPhone - accessing an NSArray in a ViewController from the AppDelegate?iPhone - 从 AppDelegate 访问 ViewController 中的 NSArray?
【发布时间】:2011-08-04 18:39:59
【问题描述】:

我希望能够访问我的 iPhone 应用程序中的一组对象。对象数组填充在我的应用程序的 appDelegate 中,我希望能够在我的一个视图控制器中访问该数组。

我目前在我的 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 并尝试在我的视图控制器中记录计数:

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");

这里的日志记录到“数组设置后”,然后我在尝试从视图控制器中的数组打印计数的那一行得到“EXC_BAD_ACCESS”。

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

谁能看出我做错了什么?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    希望这会有所帮助!

    -卡罗利

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        如果是合成的,请使用getter。由于您没有使用 getter,因此它会给您带来不好的内存访问权限。

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

        NSArray *newArray = [[appDelegate getListObjArray] 保留];

        【讨论】:

        • listObjArray 实际上是 Objective-C 中的 getter!
        【解决方案4】:

        试试这个

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

        应该在getter上进行分配。

        【讨论】:

        • 谢谢,我一直忘记 . Objective-c 中的语法!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 2015-07-13
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-18
        相关资源
        最近更新 更多