【问题标题】:Cocoa Touch NSArray Initialization doesn't work properlyCocoa Touch NSArray 初始化无法正常工作
【发布时间】:2011-08-14 17:46:25
【问题描述】:

我有几个在我的 -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) 并且完全没有问题。感谢大家的帮助!

【问题讨论】:

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


    【解决方案1】:

    在提出此类问题时,请务必注意您使用的是 ARC。

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

    【讨论】:

    • 目前,我只是想对它进行 NSLog。代码是NSLog(@"%@", myArray);
    • 你能发布一个最小的例子吗?
    • 我关闭了 ARC,做了一个干净的构建,我不再有这个问题。这是一个 ARC 错误,还是我忘记做某事?
    • 这听起来像是一个 ARC 错误!请归档并在此处张贴#。我会跟进团队。
    • 谢谢。 #9956752,很抱歉我无法尝试其他构建/系统来查看问题出在哪里。
    【解决方案2】:

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

    【讨论】:

    • 我不认为这是 IBOutlet 的问题,因为当我有一个只有 NSStrings 的数组时,我会遇到同样的问题。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 是的,我就是这么做的,我只是打错了。对不起!打开 ARC,它根本不起作用。在 ARC 关闭的情况下,它可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2016-02-18
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多