0

我有一個方法getProjects。在我的方法中,我從json解析數據。我在我的實例變量projectsArray中保存項目的nameid,這是NSMutableArray可可 - 無法訪問按鈕上的實例變量點擊

問題是我有一個名爲writeFile的按鈕(IBAction),如果我嘗試單擊時記錄數組,我的應用程序崩潰。錯誤消息是ESC_BAD_ACCESS。但爲什麼?我正在使用ARC。 `Method getProjects

- (void)getProjects { 
int count = 0; 
self.projectsArray  = [NSMutableArray arrayWithCapacity:10]; 
SBJsonParser *parser = [[SBJsonParser alloc] init]; 

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@projects.json", urlPath]]]; 
NSData *response  = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 

NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 
NSArray *projects  = [parser objectWithString:json_string error:nil]; 

for (NSDictionary *project in projects) { 
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:2]; 

    [dict setObject:[project objectForKey:@"name"] forKey:@"name"]; 
    [dict setObject:[project objectForKey:@"id"] forKey:@"id"]; 

    [self.projectsArray insertObject:dict atIndex:count]; 
    [self.selectProject addItemWithTitle:[project objectForKey:@"name"]]; 
    count++; 
} 

}

我呼籲我的applicationDidFinishLaunching在applicationDidFinishLaunching

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    [self getProjects]; 
    NSLog(@"%@", self.projectsArray); 
} 

日誌的方法返回我的數組。

+0

「ESC_BAD_ACCES」 - 我不知道這樣的錯誤信息。 (提示:ortography) – 2012-08-04 14:14:48

+0

「writeFile」是什麼類,如果它不是應用程序委託,那麼運行該方法的對象如何獲取對項目數組的引用? – 2012-08-04 14:17:33

+0

該屬性被聲明爲assign並且writeFile正在運行appDelegate。對不起,我的意思是「EXC_BAD_ACCESS」。 – emha 2012-08-04 14:24:06

回答

0

嗯,看來你已經找到了問題的根源:

我改變分配保留和現在的作品。但爲什麼?

原因是通過聲明屬性爲assign,當您設置它時,其值不會保留。

所以:

  1. 你創建數組是這樣的:

    self.projectsArray  = [NSMutableArray arrayWithCapacity:10]; 
    
  2. arraywithCapacity會給你一個autoreleased對象;

  3. 將對象分配給屬性時不保留該對象;

  4. 在某個時間點,之前 NSLog被執行,對象被解除分配。

  5. 崩潰。