initWithObjects上的局部变量,NSArray,EXEC_BAD_ACCESS

时间:2013-07-10 08:08:06

标签: ios objective-c

我有一些我只需要在我的.M文件中的数组,所以我认为我在接口括号中声明它们就像在MyViewController.m中那样(我将它们变为私有变量,在Java C#lingo中)< / p>

   @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的新手,我认为我对我的声明所做的就像声明私有变量一样,如果这不正确,我很想知道正确的做法。 感谢。

6 个答案:

答案 0 :(得分:4)

通常你会使用属性来做这样的事情,但是使用ARC它并不重要。

但您遇到的问题是"3"而不是@"3"。 “3”是一个字符数组,而@是一个将数组转换为NSString的文字。由于NSArray只能存储对象,因此当您尝试添加char *

时它会崩溃

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

此行中缺少此符号 @ 。所以你需要使用这个 @“3”

答案 3 :(得分:0)

非常简单,您在@之前错过了"3"符号。

答案 4 :(得分:0)

myArray = [NSArray arrayWithObjects: @"1", @"2",@"3", @"4", nil];

答案 5 :(得分:0)

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

@interface FilterViewController {
    NSArray *myArray; 
}

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

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

@implementation FilterViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.myArray = @[@"1", @"2",@"3", @"4"];
}