[英]local variables, NSArray, EXEC_BAD_ACCESS on initWithObjects
我有一些僅在我的.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的新手,我認為聲明的過程就像聲明私有變量一樣,如果那是不正確的,我很想知道正確的方法。 謝謝。
通常,您將為此類使用屬性,但是使用ARC並不重要。
但是,這里的問題是"3"
而不是@"3"
。 “ 3”是一個字符數組,而@是將數組變成NSString的文字。 由於NSArray只能存儲對象,因此當您嘗試添加字符時會崩潰*
注意,創建數組的更好方法是使用新的“容器文字”:
myArray = @[@"1", @"2", @"3", @"4"];
然后,如果您不小心省略了@
(或者通常如果任何集合元素不是Objective-C對象),則編譯器將給出錯誤消息,而不是在運行時使應用程序崩潰。
您在此行中缺少此符號@ 。 因此,您需要使用一個@“ 3” 。
很簡單,您在"3"
之前錯過了@
符號。
myArray = [NSArray arrayWithObjects: @"1", @"2",@"3", @"4", nil];
這不是一個直接的答案,但是您不需要在擴展中聲明您的私有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"];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.