1

我有一些数组,我只需要在我的 .M 文件中,所以我认为我在接口括号中声明它们,就像在 MyViewController.m 中一样(通过这个,我将它们设为私有变量,用 Java C# 术语)

   @interface MyViewController () {
    NSArray *myArray; 
   }
   @end

   @implementation FilterViewController
   - (void)viewDidLoad
   {
      [super viewDidLoad];
      // This line throws  an error
      myArray = [NSArray arrayWithObjects: @"1", @"2","3", @"4", nil];

现在最后一行抛出一个 EXEC_BAD_ACCESS,我不知道为什么?

我是来自 C#.Net 的 Objective C 新手,我认为我对声明所做的就像声明私有变量一样,如果那不正确,我很想知道正确的做法。谢谢。

4

6 回答 6

4

通常,您会使用此类属性,但使用 ARC 则无关紧要。

但是您在这里遇到的问题是使用"3"而不是@"3". "3" 是一个字符数组,而 @ 是将数组转换为 NSString 的文字。由于 NSArray 只能存储对象,因此当您尝试添加 char* 时它会崩溃

于 2013-07-10T08:11:49.907 回答
2

请注意,创建数组的更好方法是使用新的“容器文字”:

myArray = @[@"1", @"2", @"3", @"4"];

然后,如果您不小心省略了 (或者通常如果任何集合元素不是 Objective-C 对象),编译器将给出错误消息,而不是您的应用程序在运行时崩溃。@

于 2013-07-10T08:18:07.310 回答
1

您在此行中缺少此符号@。所以你需要使用这个@"3"

于 2013-07-10T08:11:51.553 回答
0

很简单,您在.@之前错过了一个符号"3"

于 2013-07-10T08:10:55.013 回答
0
myArray = [NSArray arrayWithObjects: @"1", @"2",@"3", @"4", nil];
于 2013-07-10T08:18:56.447 回答
0

不是直接的答案,但您不需要在扩展中声明您的私有 iVar,您可以直接将其放入实现中:例如

@interface FilterViewController {
    NSArray *myArray; 
}

尽管更好的解决方案是使用您在扩展中声明的属性:

@interface FilterViewController () {
    @property (copy, nonatomic) NSArray *myArray; 
}
@end

@implementation FilterViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.myArray = @[@"1", @"2",@"3", @"4"];
}
于 2013-07-10T08:26:28.443 回答