【问题标题】:cocoa - can't access instance variable on button click可可 - 按钮单击时无法访问实例变量
【发布时间】:2012-08-04 14:11:55
【问题描述】:

我有一个名为getProjects 的方法。在我的方法中,我从 json 解析数据。我将项目的nameid 保存在我的实例变量projectsArray 中,这是一个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中的方法

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

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

【问题讨论】:

  • "ESC_BAD_ACCES" - 我不知道这样的错误消息。 (提示:正字法)
  • writeFile 在什么类中,如果不是应用程序委托,运行该方法的对象如何获取其对项目数组的引用?
  • 该属性被声明为 assign 并且 writeFile 正在运行 appDelegate。对不起,我的意思是“EXC_BAD_ACCESS”。
  • 我将分配更改为保留,现在它可以工作了。但为什么呢?

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


【解决方案1】:

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

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

原因是通过将属性声明为assign,当你设置它时,它的值不会被保留。

所以:

  1. 你可以这样创建数组:

      self.projectsArray      = [NSMutableArray arrayWithCapacity:10];
    
  2. arraywithCapacity 会给你一个自动释放的对象;

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

  4. 在某个时间点,执行 NSLog 之前,对象被释放。

  5. 崩溃。

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 2023-03-15
    • 1970-01-01
    • 2018-03-07
    • 2014-06-13
    • 1970-01-01
    • 2023-03-17
    • 2021-09-22
    • 2016-12-08
    相关资源
    最近更新 更多