cocoa - 无法在按钮点击时访问实例变量

时间:2012-08-04 14:11:55

标签: cocoa variables nsmutablearray automatic-ref-counting instance

我有一个名为getProjects的方法。在我的方法中,我从json解析数据。我将项目的nameid保存在我的实例变量projectsArrayNSMutableArray

问题是我有一个名为IBAction的按钮(writeFile),如果我尝试在点击时记录该数组,我的应用程序崩溃了。错误消息为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

中调用该方法
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [self getProjects];
    NSLog(@"%@", self.projectsArray);
}

我的applicationDidFinishLaunching中的日志返回我的数组。

1 个答案:

答案 0 :(得分:0)

好吧,看来你已经找到了问题的原因:

  

我更改了分配以保留,现在它可以正常工作。但为什么呢?

原因是通过将属性声明为assign,在设置时,不会保留其值。

所以:

  1. 您可以像这样创建数组:

      self.projectsArray      = [NSMutableArray arrayWithCapacity:10];
    
  2. arraywithCapacity将为您提供一个自动释放的对象;

  3. 将对象分配给属性时,该对象不会保留;

  4. 在某个时间点,执行NSLog之前,该对象被解除分配。

  5. 的崩溃。