从“id”变量复制

Posted

技术标签:

【中文标题】从“id”变量复制【英文标题】:Copying from "id" variable 【发布时间】:2013-12-29 19:32:05 【问题描述】:

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

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

-(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];    
    
;

【问题讨论】:

崩溃的原因是什么?什么是堆栈跟踪? 你应该分配和初始化你的 UIAlertView 对象吗? 尝试 NSLog 你的结果变量,看看它是什么。 在哪里保留 alertView? 问题似乎是它在 bg 中被随机释放.. 至少在 99% 的情况下是问题 【参考方案1】:

你的代码对我来说很奇怪。您的方法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)。

【讨论】:

您的答案看起来不错,但由于我不熟悉创建自己的 NSErrors,如果出现错误,我的方法应该返回什么?该方法需要 Network 对象,所以我将返回 nil?还有我将如何在“错误”变量中传递错误? 我尝试通过以下方式返回 nil 并在 NetworkCalculator 中初始化错误:error = [[NSError alloc] initWithDomain:@"some error" code:5 userInfo:nil];但主要的“错误”仍然为零 我发现了问题。我使用的是 NSError 而不是 NSError*。谢谢

以上是关于从“id”变量复制的主要内容,如果未能解决你的问题,请参考以下文章

从 JS 中的 ids 自动创建变量? [复制]

js数组复制(不改变原数组)

如何通过 id 访问变量? [复制]

为啥具有相同值的变量在 Python 中具有公共 ID? [复制]

我可以使用 HTML 元素的 id 作为 JavaScript 中的变量吗? [复制]

如何将数字与 div 的 id 中的字符串分开并将字符串转换为变量? [复制]