Objective C变量可通过多种方法访问

时间:2011-05-10 23:06:15

标签: objective-c ios4

这是我在ObjectiveC的第二天编程,所以我为noob问题道歉。

我有一个使用async和asihttprequest进行API调用的ViewController:

@synthesize loadingStatus;
- (void)loadStatsData
{
    [indicator setHidden:NO];

    loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ];

    [RESTApiController request:@"/method.json" method:@"GET" options:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObject:@"amount"] forKeys:[NSArray arrayWithObject:@"receiving"] ] parent:self];
}

并像这样接收:

- (void)requestFinished:(ASIHTTPRequest *)request
{
    if (receiving == @"amount")
    {
      // do stuff
      [loadingStatus setValue:@"good" forKey:@"amount"];
    }

    if ([loadingStatus valueForKey:@"amount"] == @"good"]) 
      [indicator setHidden:YES];
}

当app尝试在requestFinished()中使用loadingStatus变量时,应用程序崩溃。我想不知怎的变量得到了解除,但我不确定如何处理它。

两个问题: 1)如何在方法调用中保持loadingStatus的状态,这样我就可以按照编写代码的方式使用它 2)是否有更好的方法来实现检查API调用是否已完成并隐藏ActivityIndi​​cator的目标?

M。

2 个答案:

答案 0 :(得分:3)

这样做:将loadingStatus称为self.loadingStatus

self.loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ];

这样,它通过访问器,并在其上保留(.h文件中的@property部分)。

此外,编程提示:将行分为较小的语句,以便更容易调试。

答案 1 :(得分:2)

你是对的,正在取消分配loadingStatus。那是因为该值正在自动释放。

如果你改变了

loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ];

loadingStatus = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ];
[loadingStatus retain];

loadingStatus = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:@"bad", nil] forKeys:[NSArray arrayWithObjects:@"amount", nil ] ];

那么你的代码就可以了。

这样做的原因是从dictionaryWithObjects:forKeys返回的对象已经调用了自动释放,所以如果你想让它不被释放,你需要调用retain。

作为参考,如果调用alloc / init,则会得到一个保留计数为1的对象。如果使用了一个方法,例如dictionaryWithObjects:forKeys:你得到一个保留计数为0的对象/ strong>即可。要解决这个问题,只需添加一个保留,你就可以了。

Apple有一些关于内存管理的非常好的文档。我建议你有机会检查出来

Memory Management Guide

Memory Management Rules

希望这有帮助!

-Scott