从“id”变量复制

时间:2013-12-29 19:32:05

标签: ios objective-c memory-management

我创建了一个类NetCalculator,我在按下按钮时调用它。该方法计算网络得到2 NSString s并返回一个id对象(“网络”对象或“UIAlertView”。然后我检查哪个对象是我提供的数据。当我使用时显示2-3个警报后,UIAlertView应用程序崩溃了。

任何想法为什么会这样?在终端上,它不会显示任何错误,只是一些随机的十六进制。

-(IBAction)calculate:(id)sender {
    id result;

    Network *network = [[Network alloc]init];

    NetCalculator *netCalculated = [[NetCalculator alloc] init];
    result = [netCalculated calculateNetworkWithIP:ipLabel.text andSubnet:subnetLabel.text];

    if([result isKindOfClass:[Network class]]){
        network = result;
        NSLog(@"network %@",network.networkIP);    
    }

    else if([result isKindOfClass:[UIAlertView class]]) {

        UIAlertView *alert;
        alert = result;

        [alert show];    
    }
};

1 个答案:

答案 0 :(得分:0)

你的代码对我来说很奇怪。您的方法calculateNetworkWithIP可能会返回Network结果或UIAlertView结果。我不会遵循这样的方法。

如果问题依赖于记忆,你应该向我们展示这种方法的实施方法。

无论如何,我会提出一些更改(以下代码不考虑ARC或非ARC代码)。特别是,我会修改calculateNetworkWithIP以返回Network结果。如果出现问题并且将其作为参数传递,则会填充错误。

- (Network*) calculateNetworkWithIP:(NSString *)ip subnet:(NSString*)subnet error:(NSError**)error 

如果一切正常,结果将是Network,因此打印或在某处重复使用。否则,将返回NSError并基于该创建并显示警报视图。

所以,这里有伪代码。

NetCalculator *netCalculated = [[NetCalculator alloc] init];

NSError* error = nil;
Network* networkResult = [netCalculated calculateNetworkWithIP:ipLabel.text subnet:subnetLabel.text error:&error];

if(error != nil) {
    // create and show an alert view with the error you received
} else {
    // all ok so, for example, save the result in a instance variable
}

要采用类似方法,您可以查看why is "error:&error" used here (objective-c)

相关问题