簡體   English   中英

局部變量,NSArray,initWithObjects上的EXEC_BAD_ACCESS

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM