这是我在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调用是否已完成并隐藏ActivityIndicator的目标?
M。
答案 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有一些关于内存管理的非常好的文档。我建议你有机会检查出来
希望这有帮助!
-Scott