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. 崩溃。