存档后,iOS App的表现形式不同

时间:2013-04-23 14:42:52

标签: ios xcode asihttprequest objective-c-blocks

直接从手机上的xcode运行应用程序时,一切运行良好。 归档并将其作为存档运行后,应用程序的行为方式不同,并且行为不符合预期。这是从存档运行时asihttprequest永远不会结束的部分。 我很乐意帮忙。

id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];

[tracker sendEventWithCategory:@"uiAction"
                    withAction:@"station pressed"
                     withLabel:@"Station number"
                     withValue:num];

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://server.com/servlet?stationId=%d",    [num intValue]]];

__weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
NSLog(@"0");

[request setCompletionBlock:^{
    @try {
        NSLog(@"1");
        StopParser *stop = [[StopParser alloc]init];
                    NSLog(@"2");
        timesArray = [stop getStationsListfromString:[request responseString]];
                    NSLog(@"3");
        [stView.downlodingLabel setHidden:YES];
        [stView.downloadingIndicator setHidden:YES];
        [stView.tableview reloadData];
        [stView.tableview setHidden:NO];


    }
    @catch (NSException *exception) {
                    NSLog(@"4");
        [stView.downloadingIndicator setHidden:YES];
        [stView.downlodingLabel setHidden:NO];
        [stView.downlodingLabel setText:@"נא לנסות מאוחר יותר"];
        [stView.tableview setHidden:YES];

    }
    @finally {
        [refreshControl endRefreshing];
    }

}];
[request setFailedBlock:^{
                NSLog(@"5");
    [stView.downloadingIndicator setHidden:YES];
    [stView.downlodingLabel setHidden:NO];
    [stView.downlodingLabel setText:@"נא לנסות מאוחר יותר"];
    [stView.tableview setHidden:YES];
    [refreshControl endRefreshing];

}];
[request startAsynchronous];

2 个答案:

答案 0 :(得分:3)

我认为__weak是你的问题。请改用__block

没有为request保存强引用,因此它已被释放。

ARC Introduces New Lifetime Qualifiers

  • __weak指定不使引用对象保持活动状态的引用。当没有对该对象的强引用时,弱引用设置为nil。

The __block Storage Type

__block变量存在于变量的词法范围与在变量的词法范围内声明或创建的所有块和块副本之间共享的存储中。因此,如果在帧内声明的块的任何副本存活超出帧的结尾(例如,通过在某处排队以便稍后执行),则存储将在堆栈帧的破坏中存活。给定词法范围内的多个块可以同时使用共享变量。


<强>更新

要明确我的建议是替换:

__weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

使用:

__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

这不应导致保留周期。

答案 1 :(得分:0)

通常,归档文件具有与调试版本不同的构建配置,这在模拟器中更常见。确保您以两种方式测试相同的配置。每个版本之间可能会有所不同。

我们使用debug,ad-hoc和release build配置。后两者用于存档。 ad-hoc可以直接从Xcode构建和运行,以便来自该配置的存档应该是相同的。