我有一些我只需要在我的.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的新手,我认为我对我的声明所做的就像声明私有变量一样,如果这不正确,我很想知道正确的做法。 感谢。
答案 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"];
}